今天看项目代码的时候,看到类似的这样的代码:

1
2
3
4
class B : public A {
protected:
SOME_MACRO(B)
}

SOME_MACRO是一个宏,它的实现大概长这样:

1
#define SOME_MACRO(theClass) theClass::foo() {}

心想,这尼玛也能编译过,是不是有我不知道的地方?

于是,写了一个最小Demo进行验证,

1
2
3
4
class B {
protected:
void B:foo() {}
}

结果没编译过,提示

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