C++标识符

4

C++ Primer指出:

我们在程序中定义的标识符不能包含2个连续的下划线,也不能以下划线紧接着大写字母开头。此外,在函数之外定义的标识符不能以下划线开头。

一切都很好,但是...

int _c = 55;                  // outside function starts with _

int main () {

    int _A = 12;              // _ followed by uppercase letter
    cout << _A << endl;

    int __b__ =33;            // 2 consecutive __
    cout << __b__ << endl;

    cout << _c << endl;

}

代码在Mac上可以完美编译,使用的是g++ 4.7.1编译器,并使用以下标志。

g++ -pedantic -Wall -Werror -std=c++11 -O3 -funroll-loops -fprefetch-loop-arrays

我错过了什么吗?



3
当你打破“规则”时,并不保证它不起作用,可能起作用,也可能不起作用。 - Mysticial
1
相关:https://dev59.com/KHVC5IYBdhLWcg3woSxW - Bart
并非所有不正确的内容都必须无法编译。就像并非你在英语中能够构成的每个句子都必须自动具有意义一样。 - Kerrek SB
此外,您应避免使用以下划线开头并后跟小写字母的标识符(不仅是大写字母,如书中所述)。在我的编译器和操作系统中,已经使用了_pthread_cleanup_buffer - Adola
2个回答

9
穿过马路时不看车辆双向行驶并不“保证”你会被公交车撞到,但这仍然是个坏主意。
总有那么一天它行不通...

4

没有什么特别的含义。以下划线开头后面跟大写字母和两个下划线的标识符只是被保留而已。

你的编译器供应商可能随时决定使用它们(例如,编译器供应商可以将 _A 用作关键字),因此你不应该使用它们。通常,标准库是使用保留标识符实现的,因此它们不会导致编译错误。


有没有一种方法将这些视为警告? - James Leonard
不行,那样做不行,因为编译器无法区分标准库的代码和你自己的代码。 - Anteru

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接