Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ GCC是否会产生结构/类名不匹配,如VS?_C++_Visual Studio_Gcc - Fatal编程技术网

C++ GCC是否会产生结构/类名不匹配,如VS?

C++ GCC是否会产生结构/类名不匹配,如VS?,c++,visual-studio,gcc,C++,Visual Studio,Gcc,我想让GCC生成一个警告,VisualStudio在发现同时使用class和struct声明的名称时会生成该警告。(警告4099)这通常源于转发声明,例如: struct Base; ... class Base { ... }; 在这种情况下,VS实际上无法链接,因此我将警告升级为错误。由于这个项目是跨平台的,我希望在使用GCC编译时也能发现这个问题——否则我可能会意外地签入在VS中无法工作的代码 是否有任何开关或方法使GCC也拒绝或警告此类类/结构声明不匹配 注意:从评论中不确定此警告是否

我想让GCC生成一个警告,VisualStudio在发现同时使用
class
struct
声明的名称时会生成该警告。(警告4099)这通常源于转发声明,例如:

struct Base;
...
class Base { ... };
在这种情况下,VS实际上无法链接,因此我将警告升级为错误。由于这个项目是跨平台的,我希望在使用GCC编译时也能发现这个问题——否则我可能会意外地签入在VS中无法工作的代码

是否有任何开关或方法使GCC也拒绝或警告此类类/结构声明不匹配


注意:从评论中不确定此警告是否合法。对于我的问题,这与此无关,因为这种情况会导致VisualStudio中的链接失败(我不能忽略警告)。因此,我只想确定使用GCC时出现的问题,这样我的windows编译器就不会突然停止工作。

GCC并不关心这些差异。安腾ABI以同样的方式处理
结构
,只留下纯粹的语法差异


Clang有
-Wmismatched标记
来激活此检测,但我找不到gcc等价物(如果有)。

您使用的是哪个版本的VC++。VC++6.0中有一个错误,这意味着它以不同的方式处理
struct
class
,但这在以后的编译器中已经修复;例如,我在VC++2005中没有收到任何警告。

因为第10版gcc也像clang一样提供了
-Wmismatched标记
标志

VS的警告实际上是不正确的。代码很好。:-)@波,我相信同样的事情。如果这只是一个警告,我可能会禁用它。但是,在链接时,它实际上会产生错误,因为它为类编译了具有不同损坏名称的不同模块。@Bo:不是。标准明确规定了这一点。要真正区分两者,只需要一个复杂的头脑…@马修:是的。7.1.5.3/3说“无论是
class
还是
struct
类键,都应该用来指代使用
class
struct
类键声明的类”。我发现了一个关于这个主题的讨论,Jerry发现了与上面@Mike相同的引用,并将其解释为可以自由交换。不过,在对他的回答的评论中有很多讨论。我知道GCC并不在意。我认为C++标准也不关心。但愚蠢的VS确实在乎,它在链接时会中断。如果GCC没有办法注意到这一点,那就太不幸了。@edA-qa-mort-ora-y:事实上,标准很重要,我就是找不到它的精确位置,在其中查找
struct
也没有多大帮助…@MatthieuM。不,标准不在乎。前向声明
struct Foo
与前向声明
class Foo
相同,这意味着它们必须使用相同的损坏。请参阅[dcl.type.elab]p3,其中说明您可以在类的详细类型说明符中使用
struct
class
,而无论它是用
struct
还是
class
声明的。我不介意解决这个问题,因为我同意有问题的警告。我只是想要一种使用GCC来检测它的方法。你可能会认为有问题,但语言说没有;我甚至没有收到VC++2005的警告,我也不认为你可以从g++得到警告。不,你没有收到gcc的警告。从各种评论来看,不清楚这是否是错误的。然而,除此之外,它与VS链接器断开,因此识别它们会很好。@edA qa mort-ora-y Yes。我刚刚验证了这个bug仍然存在于VC 2005中——我本以为它已经被修复了。最明显的“最佳”解决方案是删除编译器:-),但我知道这并不总是(甚至经常)一个好的解决方案。如果不能做到这一点,考虑到您无法从g++获得警告,最简单的解决方案可能只是在一个上进行标准化:始终
class
或始终
struct
<代码>grep将显示任何违反规则的行为。这种混乱的差异今天似乎仍然存在: