我正在开发一个项目,我正在尝试用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”声明会阻止空参数列表问题,但事实并非如此。当我声明我的结构的个人副本时,我不知道是否需要添加特殊代码,但它似乎不起作用。
我无法测试您的设置,但我发现(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代码。
我对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