C++ 条件#基于另一个定义的符号定义

C++ 条件#基于另一个定义的符号定义,c++,c-preprocessor,C++,C Preprocessor,在C/C++中是否可以嵌套一个预处理器#define(在本例中为#ifdef)?我希望能够做到这一点: #ifdef _DEBUG_ #define __DEV_MODE_VERBOSE__ // Defined in DEBUG mode only #endif 其想法是“\uuu开发模式\uu详细\uuuu”通常会被注释掉。未注释时,我可以使用以下内容: #ifdef __DEV_MODE_VERBOSE__ int test = (5 * GetTickCount()); // No

C/C++中是否可以嵌套一个预处理器
#define
(在本例中为
#ifdef
)?我希望能够做到这一点:

#ifdef _DEBUG_
#define __DEV_MODE_VERBOSE__  // Defined in DEBUG mode only
#endif
其想法是“
\uuu开发模式\uu详细\uuuu
”通常会被注释掉。未注释时,我可以使用以下内容:

#ifdef __DEV_MODE_VERBOSE__
int test = (5 * GetTickCount());  // Not reached!
#endif      // __DEV_MODE_VERBOSE__
记录通过我的通信链路发送和接收的命令。但是,如果
#define
被意外地保留为未注释状态,那么日志记录将不会出现在发行版(以及生产版)代码中

当我尝试如上所述定义“
\uuu DEV\u MODE\u VERBOSE\uuu
”时,它没有定义,因此我不确定语法是否错误,或者问题是否更为根本。如果我不嵌套在“
\ifdef\u DEBUG”
”及其“
\endif
”之间,则符号是定义的

N3337[global.names]:
某些名称和函数签名集始终保留给实现:

-包含双下划线的每个名称
\uuuuu>或以下划线开头,后跟大写字母的每个名称都保留给实现以供任何使用。

-每个以下划线开头的名称都保留给实现,以用作 全局命名空间


宏包含双下划线,因此保留给实现。将其更改为有效名称可以解决您的问题。

当然有可能。它应该像你一样工作。应该工作,这是通常做的。请检查包含顺序。包含双下划线或以下划线和大写字母开头的名称保留给实现使用,包括宏。@TartanLlama:谢谢您的评论。当我把“开发模式详细”改为“开发模式详细”时,它起了作用。从来不知道关于双下划线的保留规则!如果你再加上一个答案,我会接受。@JBentley:这个问题清楚地表明这是经过测试的,而且包含了足够的信息。问题是塔坦拉玛指出的无效符号名。哇,谢谢。尽管这些天我主要用Delphi和C#编写代码,但多年来我一直在涉足C/C++领域,对此我一无所知。在更改了我的符号名称后,它工作了。