强制使用宏的预处理器错误
Forcing preprocessor error with macro
有没有办法强制C++中的预处理器宏发出错误?我想做的是定义一个宏UNKNOWN
。我正在为机器人编写一些代码,我还不知道所有的电子设备都插在哪里。我希望能够在一些头文件中定义端口,例如
const int MOTOR_PORT = 1;
const int FAN_PORT = 2;
//etc.
但是,当我到达一个我还不知道的端口时,我希望能够写一些类似的东西
const int LED_PORT = UNKNOWN;
在调试模式下,UNKNOWN
只会定义为某个任意值,例如 0。但是,在发布模式下编译时,我希望它在使用UNKNOWN
时抛出错误,以便未分配的端口不会在最终版本中结束。我知道我可以使用 #error
指令强制出错,但我可以在宏中执行类似操作吗?
我已经看到了使用static_assert
的解决方案,但不幸的是我不能将C++11用于该平台。
由于宏
扩展不能产生#error
,因此可以确保宏扩展到必须诊断的内容,例如语法错误。
例如:
#ifdef RELEASE
#define UNKNOWN @Invalid_use_of_UNKNOWN
#else
#define UNKNOWN 0
#endif
const int MOTOR_PORT = 1;
const int FAN_PORT = 2;
const int LED_PORT = UNKNOWN;
int main(void) {
int x = LED_PORT;
}
@
字符不是 C 的基本字符集的一部分,因此它在注释、字符常量或字符串文本之外的外观应始终导致错误消息。($
可以工作,除了接受标识符中的$
是一个常见的扩展。 `
可能也有效,但@
更突出。
我已经定义了宏,因此它会使用 gcc 生成合理的错误消息:
c.c:9:1: error: stray ‘@’ in program
c.c:9:22: error: ‘Invalid_use_of_UNKNOWN’ undeclared here (not in a function)
并伴有叮当声:
c.c:9:22: error: expected expression
const int LED_PORT = UNKNOWN;
^
c.c:2:17: note: expanded from:
#define UNKNOWN @Invalid_use_of_UNKNOWN
^
1 error generated.
(有一个与 #pragma
指令对应的_Pragma
运算符。如果也有一个_Error
运算符会很好,但没有。
好吧,这不会产生像 #error 这样的编译器错误消息,但会在调试中编译并在发布中失败:
#ifdef _DEBUG
# define UNKNOWN 1
#else
# define UNKNOWN
#endif
const int port1 = UNKNOWN; // fail in release
你可以用零除法,这将抛出编译器错误: #define UNKNOWN 0/0
sizeof
运算符不能应用于不完整的类型,因此请尝试以下操作:
// Declared, but not defined anywhere.
struct illegal_use_of_unknown_macro;
#define UNKNOWN (sizeof (illegal_use_of_unknown_macro))
相关文章:
- 错误:无效的预处理指令 #i 的意思是 #if?
- C++预处理会生成变量成员、资源库和映射
- 使用预处理指令检查是否包含标头?
- 预处理的 C/C++ 文件是否特定于计算机?
- 使用 GCC 对 C 文件进行部分预处理(不删除 "define" 指令)
- 在 CPLEX 中求解线性规划,无需剪切和预处理
- CPP -D 选项,用于预处理 Fortran 代码
- 错误:粘贴"tmp_UINT"和"+"未提供有效的预处理令牌
- 任务计划程序库的预处理不起作用 - 多定义错误
- Eclipse 问题 - 编译期间不考虑 .c 和 .cpp 文件中定义的预处理
- 使用python预处理后,C++(opencv)中的垫子类型数据与image_to_array相同
- Howo 使用 cl 预处理为 masm 组装生成一个单独的文件
- 我有一个预处理的 C/C++ 源文件 (cacti.i).如何从这个 .i 文件生成可执行二进制文件,以便我可以像 ./
- 如何使用Visual Studio C/C++编译器(cl.exe)来预处理我的objective-C代码
- 是具有预处理前分支实现的结构违反ODR
- 与不完整的Cholesky预处理的共轭梯度返回特征库的意外错误
- Visual Studio C - 无法输出预处理文件
- 在海湾合作委员会中加快宏观预处理的任何方法
- Xmllint未设置,而在路径中找不到XMLLINT;跳过XML预处理
- 当头文件被预处理时是否有一个预处理器选项显示?