我在gcc中编译一些可移植代码时遇到了这个问题。基本上,这个奇怪的代码在Visual Studio中编译,确实让我大吃一惊:

Visual studio让这一切飞起来。 gcc将其视为编译错误。有趣的是,如果将def Zebra键入int,则VC++会抱怨。相当矛盾的行为。有想法吗?

评论

这不是一个错误,它是一个编译器扩展,并且是一个邪恶的扩展。

MSVC确实有警告C4239:使用了非标准扩展名,但显然您已关闭该警告。

我不明白为什么您需要使用无限递归函数进行演示。

#1 楼

这是Visual Studio的旧扩展,我在Microsoft网站上只能找到此错误报告:临时对象可以绑定到非常量引用,该示例具有以下示例代码:

struct A {};

A     f1();
void f2(A&);

int main()
{
    f2(f1()); // This line SHALL trigger an error, but it can be compiled without any     errors or warnings.
}


响应说明之一:


有4级警告(如果将/ W4传递给编译器,则启用4级警告)


此博客文章:Visual C ++如此自由,涵盖了此扩展说明:


使用禁用语言扩展(/ Za)使它成为一个错误:


#2 楼

正如其他人所说,这是由于Microsoft C ++扩展。尽管不建议使用/Za标志,因为它可能会损坏东西。

而是使用/permissive-开关以获得更好的标准合规性,对于这些情况,您会得到健康的错误。请注意,此标志自VS 2017起可用。


开关/ Za不支持某些关键的Microsoft SDK头文件。相比之下,/ permissive-提供了一种有用的一致性模式,其中输入的C ++代码根据ISO C ++规则进行解释,但是还允许在Visual C ++支持的目标上编译C ++所需的一致性扩展。


更多有关信息,请参见Visual C ++ Team Blog。

评论


可能值得注意的是/ permissive标志自VS 2017开始可用。您可以通过添加文章中的相关引号来改善此答案。就像做什么一样,为什么介绍了它以及与/ Za的关系

– bolov
17-10-23在8:59