我尝试将#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!"
如果我在第一行的末尾插入一个反斜杠,则诊断消息将包含第二行的开头和第一个单词(一个)之间的所有空白。如果两行都是字符串,诊断消息将显示内部双引号。
那么问题是:我如何实现此输出? (或类似的双引号,但包括撇号)
#error "The charging pins aren't differing! One pin cannot be used for multiple purposes!"
答案 0 :(得分:5)
不幸的是,您无法拥有全部。
\
换行。您不能在字符串文字中间进行此操作,因为那样的话,它将不是有效的预处理令牌。但这会使输出看起来很奇怪,例如: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!
英文稍作修正,您会在可读源和可读错误消息之间取得最佳折衷。
答案 1 :(得分:0)
如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;
}