如何编译代码,其中字段与类型具有完全相同的名称?

时间:2015-12-24 08:58:11

标签: c++

我从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;

据我所知,我不能对类型和字段使用相同的名称。 但我链接的库被广泛使用,它必须编译。 我的编译器设置可能有问题吗?如何编译我的代码?

3 个答案:

答案 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 ++,这会使解决方案变得非常明显 - 将openonload-201509/src/include/etherfabric/ef_vi.h:119:33: error: changes meaning of ‘ef_addr’ from ‘typedef uint64_t ef_addr’ [-fpermissive]添加到编译器标志中。不,不要这样做!使用C编译器,或者更确切地说,使用-fpermissive。代码用C语言编写,应该这样处理。

答案 2 :(得分:0)

引用(总是神秘!)标准:

  

3.3.7 [basic.scope.class]

     

2)在S类中使用的名称N应在其上下文中引用相同的声明,并在完成的S范围内重新评估。违反此规则不需要诊断。

在上面的类中,在声明ef_addr ef_addr;之后,名称ef_addr现在引用成员而不是类型(在类pkt_buf范围内。

海湾合作委员会已选择发布诊断。在这种情况下铿锵不行。两者都是正确的。

如果您能够更改标题,那么我会通过使用#pragma包围类定义来关​​闭此错误,以在本地关闭警告。

如果没有,请将pragma放在包含标题的位置(即尽可能严格限定范围)