【发布时间】:2021-05-25 01:07:22
【问题描述】:
int main(){\
int a = 5;\
return a;\
}
以上编译正常。我假设 C 预处理器在编译之前删除了反斜杠?
int main(){
int a = 5;
return a;}
似乎并非所有\n(新行)字符都像使用宏一样被删除,它只是主要删除了反斜杠。
我已经看到这用于多行宏,例如:
#define TEST(in)\
int a = in; \
int b = 6;
int main(){
TEST(5)
return 0;
}
int main(){
int a = 5; int b = 6;
return 0;
}
预处理将删除上面示例中的反斜杠以及\n 字符,但为什么在我的第一个示例中它没有删除所有换行符?
【问题讨论】:
-
我认为 c 预处理器没有任何实际要求来确保在输出中包含或删除换行符。
-
请注意,
gcc -E的行为没有被标准指定,它是 gcc 实现的产物。该标准仅根据原始源(预处理之前)指定二进制文件的行为 -
我相信它正在尝试以保留错误消息的行数的方式扩展反斜杠换行符。它发出换行符,以便解析器在编译第 n 行时看到 n-1 个换行符。
-
如果您使用
gcc -P -E而不仅仅是-E,您将在一行中获得所有预处理输出。-P表示“不保留有关令牌原始源位置的信息”;当您运行 C 预处理器而不打算将输出提供给 C“适当的编译器”(又名“翻译阶段 7”)时,这通常是您想要的。
标签: c c-preprocessor