我从here复制粘贴了一些代码,无法编译。这部分问题:
struct pkt_buf {
/* I/O address corresponding to the start of this pkt_buf struct */
ef_addr ef_addr;
我有这个错误:
openonload-201509/src/include/etherfabric/ef_vi.h:119:33: error: changes meaning of ‘ef_addr’ from ‘typedef uint64_t ef_addr’ [-fpermissive]
typedef uint64_t ef_addr;
据我所知,我不能对类型和字段使用相同的名称。 但我链接的库被广泛使用,它必须编译。 我的编译器设置可能有问题吗?如何编译我的代码?
答案 0 :(得分:5)
源代码是efsink.c
,这是一个C文件。
此代码在C中有效,但在C ++中无效(我认为)。
您应该使用C编译器来编译C文件。 C和C ++是不同的语言。
主要的C ++编译器也捆绑了一个C编译器,通常他们根据文件名自动检测语言(但这可以用开关覆盖)。
您可以拥有一个包含一些C文件和一些C ++文件的项目,但您必须使用C编译器来存储C文件,并使用C ++编译器来存储C ++文件。
答案 1 :(得分:0)
不幸的是我不确定为什么会出现这个问题编辑:出现这个问题是因为很多东西在C中有效但在C ++中没有 - 例如,声明一个动态长度的数组,即{{1在C中有效但在C ++中无效。查看链接,它是一个C文件,应该使用int bob[x]
进行编译。
gcc
如果你使用g ++,这会使解决方案变得非常明显 - 将不,不要这样做!使用C编译器,或者更确切地说,使用openonload-201509/src/include/etherfabric/ef_vi.h:119:33: error: changes meaning of ‘ef_addr’ from ‘typedef uint64_t ef_addr’ [-fpermissive]
添加到编译器标志中。-fpermissive
。代码用C语言编写,应该这样处理。
答案 2 :(得分:0)
引用(总是神秘!)标准:
3.3.7 [basic.scope.class]
2)在S类中使用的名称N应在其上下文中引用相同的声明,并在完成的S范围内重新评估。违反此规则不需要诊断。
在上面的类中,在声明ef_addr ef_addr;
之后,名称ef_addr
现在引用成员而不是类型(在类pkt_buf
范围内。
海湾合作委员会已选择发布诊断。在这种情况下铿锵不行。两者都是正确的。
如果您能够更改标题,那么我会通过使用#pragma
包围类定义来关闭此错误,以在本地关闭警告。
如果没有,请将pragma放在包含标题的位置(即尽可能严格限定范围)