MSVC的标准符合性,这也能编译过?
今天看项目代码的时候,看到类似的这样的代码:
1 | class B : public A { |
SOME_MACRO是一个宏,它的实现大概长这样:
1 |
心想,这尼玛也能编译过,是不是有我不知道的地方?
于是,写了一个最小Demo进行验证,
1 | class B { |
结果没编译过,提示
1 | error C4596: “foo”: 成员声明中的非法限定名 |
老邓大神告知,这个写法在MSVC下是可以编译过的,至于为什么在最小Demo中编译不通过,可能是有什么编译开关进行控制。
标准符合性
Google了一下,原来这是MVSC的标准符合性,为了使代码更具移植性,更贴近C++标准,MSVC增加了此选项。
由于我本机的版本是Visual Studio 2019, 此选项(符合模式)的值是 /permissive-
而在我阅读的项目代码的工程(此工程是由更老的Visual Studio版本创建的)中,此选项的值是默认值
选项
默认值
不启用标准符合性检查。
如果是Visual Studio 2017 15.5 版之前创建的工程,是没有标准符合性检查的。
/permissive-
启用所有严格标准符合性编译器选项,并禁用大部分特定于 Microsoft 的编译器扩展(但有一些例外,比如 __declspec(dllimport))。
Visual Studio 2017 15.5 版和更高版本创建的新项目,
/permissive-
是默认值。/permissive
可以通过使用
/permissive
不带尾随破折号的选项来显式启用 Microsoft 扩展支持。Visual Studio 2019 版本16.8 及更高版本支持。