1

我知道在 C++ 中,标识符中的双下划线是为编译器保留的。我在相应的头文件中有一些具有类似特征的 C 代码:

extern "C" {
    #define HELLO__THERE 1
    int hello__out__there( int );
}

我将在 C++ 项目中使用此标头,并计划在 C++ 中执行以下操作:

if (HELLO__THERE == abc) 
    hello__out__there(foo);

标准涵盖了 C++ 中的这种可接受的行为吗?

4

4 回答 4

12

在 C++03 标准17.4.3.1.2 Global names中,下划线的使用被定义为保留:

每个包含双下划线 (_ _) 或以下划线后跟大写字母 (2.11) 的名称都保留给实现以供任何使用。

保留意味着它可以用于任何符合要求的实现中,因此不建议使用它。

于 2011-07-20T02:18:15.087 回答
2

您应该没问题,除非碰巧其中一个定义与您的编译器的定义发生冲突。如果是这种情况,很可能是一个警告或错误(取决于你的编译器的配置)会有一个重复的符号。

希望能帮助到你。干杯!

于 2011-07-20T02:00:29.423 回答
0

方法调用可以,但为什么将 HELLO_THERE 与某个值 abc 进行比较?如果您正在测试是否存在某个方法,我会将其包装在 #ifdef ... #endif 中,因为如果 hello_out _there由于某种原因未定义,则会出现编译错误。

于 2011-07-20T01:38:55.610 回答
-11

标识符中的双下划线是为编译器保留的

首先,我猜它是下划线。其次,保留此类标识符。这不会阻止一个人不使用它。您可以使用它(直到没有命名冲突)。

标准涵盖了 C++ 中的这种可接受的行为吗?

是的。这是可以接受的。但是,可接受的代码和好的代码之间是有区别的。如果您遵循正确的编码指南,那么您的代码将是好的并且可以接受。恕我直言,您应该参考互联网上一些好的编码标准;它会对你有很大帮助。

于 2011-07-20T02:00:08.480 回答