我想知道如何在多行上定义一个非常长的字符串。 我尝试了很多不同的模式,但它们都没有工作.. 这是我的代码。
#define EXAMPLE "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
"ccccccccccccccccccccccccccccccccccc"
"ddddddddddddddddddddddddddddddddddd"
我得到语法错误。 我得到的错误是
ccompile.h (as included in test.c)
=================
error: syntax error before or at: g
*** Error code 2
我要分配" aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbccccccccccccccdddddddd"示例。
我尝试使用\和@ \但是没有成功。
答案 0 :(得分:7)
摆脱线条之间的空白,引用整个事物。 EOL中的\
基本上“转义”换行符,因此它不会成为字符串本身的一部分。它仅与预处理器相关:
#include <stdio.h>
#define LONG_STRING "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\
ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
int main ( void ) {
printf(LONG_STRING);
return 0;
}
出于审美原因,您可以单独引用每一行,唯一的要求是在结束引号后直接添加\
:
#define LONG_STRING "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"\
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"\
"ccccccccccccccccccccccccccccccccccccccccccccc"
这也适用于just fine
两个建议不是 100%等效。第一个版本将宏定义为单个字符串文字。第二个版本将宏定义为3 单独的字符串文字。在大多数情况下,这不是什么大问题,因为在翻译阶段,应该连接相邻的字符串文字标记:
5.1.1.2翻译阶段:
[...]
6.连接相邻的字符串文字标记 7.分隔标记的空白字符不再重要。每 预处理令牌转换为令牌。由此产生的代币是 语法和语义分析和翻译为翻译单位。
我找不到Meninx提到的关于C99表现不同的脚注。文档我使用了can be found here
答案 1 :(得分:3)
#define EXAMPLE "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
"ccccccccccccccccccccccccccccccccccc"
"ddddddddddddddddddddddddddddddddddd"
对于上述指令,其替换列表仅限于"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
,因为宏定义仅适用于单个逻辑行。
此外,在预处理期间,在C中无法连接相邻的字符串文字以形成单个文字。
C99 脚注148 :
148:请注意,相邻的字符串文字不会连接成a 单字符串文字
而是使用反斜杠换行符:
#define EXAMPLE "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\
ccccccccccccccccccccccccccccccccccc\
ddddddddddddddddddddddddddddddddddd"
C99 5.1.1.2 p / 2
- 删除紧跟一个新行字符的反斜杠字符()的每个实例,将物理源行拼接到 形成逻辑源行。任何物理上只有最后一个反斜杠 源线应有资格成为此类拼接的一部分。一个 非空的源文件应以换行符结尾 在任何之前不得立即使用反斜杠字符 发生了这样的拼接。
醇>