将空参数列表函数从C转换为C ++

问题描述 投票:0回答:2

我正在开发一个项目,我正在尝试用C ++编译VxWorks END。我认为我不能改变C ++的工作,我绝对不能过多地改变VxWorks。

除了一个问题,这已经大部分都没有了。 VxWorks要求所有驱动程序在net_funcs结构中注册其方法,该结构具有以下字段(以及其他字段):

#ifdef __cplusplus
extern "C" {
#endif
...

typedef struct net_funcs
    {
    ...
    STATUS (*pollSend) (END_OBJ*, M_BLK_ID); /* Driver's polling send func. */
    STATUS (*pollRcv) (END_OBJ*, M_BLK_ID); /* Driver's polling recv func. */

    /*
     * The minimum required arguments for (*formAddress)() are:
     * (*formAddress)(M_BLK_ID, M_BLK_ID, M_BLK_ID, BOOL)
     */
    M_BLK_ID (*formAddress) ();           /* Driver's addr formation func. */

    /*
     * The minimum required arguments for (*packetDataGet)() are:
     * (*packetDataGet)(M_BLK_ID, LL_HDR_INFO *)
     */
    STATUS (*packetDataGet) ();           /* Driver's addr formation func. */
    ...
    } NET_FUNCS
...
#ifdef __cplusplus
}
#endif

注意C风格的空参数列表。在C中,这意味着该字段可以是接受任何参数的仿函数;但是,在C ++中编译时,它会将这些参数视为(void),然后在尝试实例化结构时抛出错误。如果我尝试将参数更改为(first arg,...),则传入默认的lib文件调用(endEtherAddressForm和endEtherPacketDataGet,两者都是根据软件手册推荐的lib文件调用)会导致错误,因为这些仿函数需要四个特定的参数,不接受可变数量的args。

我可能只是将它硬编码到默认函数的参数列表中并希望最好,但在此之前,有没有办法让这个代码在C和C ++中使用变量参数列表?或者我需要做些什么来使外部“C”结构跨两个文件工作?

更新:

在实例化结构时,我使用以下代码:

LOCAL NET_FUNCS MBbufferNetFuncs =
    {
    ...
    MyCode::EndPollSend,
    MyCode::EndPollRcv,
    endEtherAddressForm, /* Library function from endLib.lib; declaration
        M_BLK_ID endEtherAddressForm(M_BLK_ID, M_BLK_ID, M_BLK_ID, BOOL)*/
    endEtherPacketDataGet /* Library function from endLib.lib; declaration
        STATUS endEtherAddressForm(M_BLK_ID, LL_HDR_INFO *)*/
    }

该错误表明:

"A value of type "M_BLK_ID (*)(M_BLK_ID, M_BLK_ID, M_BLK_ID, BOOL)" cannot be used to initialize an entry of type "M_BLK_ID (*)()""

通常,人们会认为net_func声明开头的extern“C”声明会阻止空参数列表问题,但事实并非如此。当我声明我的结构的个人副本时,我不知道是否需要添加特殊代码,但它似乎不起作用。

c++ c parameter-passing vxworks
2个回答
0
投票

我无法测试您的设置,但我发现(clang -Wpedantic)很满意:

extern "C" int f(...);
int r(int c) {
    return f(c) * c;
}
int main(void) { 
    return r(2);
}

它甚至工作,所以一定不能是未定义的行为...... :)但是你需要做一些有点丑陋的事情:

ifdef __cplusplus
#define CLARGS ...
#else
#define CLARGS
#endif

然后发表你的声明:

M_BLK_ID (*formAddress) (CLARGS);

防止C ++泄漏C代码。


0
投票

我对C和C ++有点生疏,但如果内存服务......

函数参数的C语法是:

void foo1();              // Zero or more unspecified args
void foo2(int a, ...);    // One or more args
void foo3(void);          // No args

C ++语法是:

void bar1(...);           // Zero or more unspecified args
void bar2(int a, ...);    // One or more args
void bar3();              // No args
© www.soinside.com 2019 - 2024. All rights reserved.