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 及更高版本支持。