我尝试将#error指令与GCC编译器一起使用,如下所示:
#error "The charging pins aren't differing! One pin cannot be used for multiple purposes!"
This说,我应该使用双引号,所以参数将是一个单独的字符串常量,我可以在其中使用撇号。但是,我希望这个字符串出现在多行代码的源代码中,如:
#error "The charging pins aren't differing!
One pin cannot be used for multiple purposes!"
然后,我收到一些错误消息:
warning: missing terminating " character
#error "The charging pins aren't differing! One pin
error: missing terminating " character
cannot be used for multiple purposes!"
如果我在第一行的末尾插入一条黑色长片,则诊断消息将包含第二行开头和第一个单词(One)之间的所有空格。如果两行都是字符串,则诊断消息显示内部双引号。
所以问题是:我如何实现这一输出? (或类似的没有双引号,但包括撇号)
#error "The charging pins aren't differing! One pin cannot be used for multiple purposes!"
不幸的是,你无法拥有一切。
\
打破这一行。您不能在字符串文字的中间执行此操作,因为它不会是有效的预处理标记。这将使输出看起来很奇怪,例如:error: "hello" "world"
。相关的翻译阶段(从C17 5.1.1.2开始)按此顺序执行:
2)删除反斜杠字符()后面紧跟一个新行字符的每个实例,拼接物理源代码行以形成逻辑源代码行。
3)源文件被分解为预处理标记和空白字符序列(包括注释)。
4)执行预处理指令,......
6)连接相邻的字符串文字标记。
#error
在步骤4中执行,早于步骤6中的字符串文字串联。
我个人认为最好的解决方案是跳过撇号:
#error The charging pins are not differing! \
One pin cannot be used for multiple purposes!
轻微修复英语,您可以在可读源和可读错误消息之间获得最佳折衷。
如上所述here
'#
error
'和'#warning
'都没有扩大其论点。内部空白序列每个都用一个空格替换。该行必须包含完整的令牌。最明智的做法是使这些指令的参数为单个字符串常量;这避免了撇号等问题。
所以你只能在一行中使用它。
#include <stdio.h>
//#define var 10
#ifdef var
#error "The charging pins aren't differing! One pin cannot be used for multiple purposes!"
#endif
int main(void){
printf("in main() \n");
return 0;
}