#define 多行字符串
#define string over multiple lines
我想知道如何在多行上定义一个非常长的字符串。
我尝试了很多不同的模式,但其中 none 有效..
这是我的代码。
#define EXAMPLE "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
"ccccccccccccccccccccccccccccccccccc"
"ddddddddddddddddddddddddddddddddddd"
我收到语法错误。
我得到的错误是
ccompile.h (as included in test.c)
=================
error: syntax error before or at: g
*** Error code 2
我想将 "aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbccccccccccccccdddddddd" 分配给 EXAMPLE。
我尝试使用 \ 和 @\ 但没有成功。
去掉行与行之间的空格,并引用整个内容。 EOL 处的 \
基本上是 "escapes" 换行符,因此它不会成为字符串本身的一部分。它仅与预处理器相关:
#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 separate 字符串文字。在大多数情况下,这没什么大不了的,因为在翻译阶段,应该连接相邻的字符串文字标记:
5.1.1.2 Translation phases:
[...]
6. Adjacent string literal tokens are concatenated.
7. White-space characters separating tokens are no longer significant. Each
preprocessing token is converted into a token. The resulting tokens are
syntactically and semantically analyzed and translated as a translation unit.
我找不到 Meninx 提到的关于 C99 行为不同的脚注。我使用的文档 can be found here
#define EXAMPLE "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
"ccccccccccccccccccccccccccccccccccc"
"ddddddddddddddddddddddddddddddddddd"
对于上面的指令,它的替换列表仅限于 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
因为宏定义只适用于 单个逻辑行 .
此外,在 预处理.
期间,在 C 中不可能将相邻的字符串文字连接起来形成一个单独的文字
C99 脚注 148:
148: Note that adjacent string literals are not concatenated into a
single string literal
改为使用 backslash-newline :
#define EXAMPLE "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\
ccccccccccccccccccccccccccccccccccc\
ddddddddddddddddddddddddddddddddddd"
C99 5.1.1.2 p/2
- Each instance of a backslash character () immediately followed by a new-line character is deleted, splicing physical source lines to
form logical source lines. Only the last backslash on any physical
source line shall be eligible for being part of such a splice. A
source file that is not empty shall end in a new-line character, which
shall not be immediately preceded by a backslash character before any
such splicing takes place.
我想知道如何在多行上定义一个非常长的字符串。 我尝试了很多不同的模式,但其中 none 有效.. 这是我的代码。
#define EXAMPLE "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
"ccccccccccccccccccccccccccccccccccc"
"ddddddddddddddddddddddddddddddddddd"
我收到语法错误。 我得到的错误是
ccompile.h (as included in test.c)
=================
error: syntax error before or at: g
*** Error code 2
我想将 "aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbccccccccccccccdddddddd" 分配给 EXAMPLE。
我尝试使用 \ 和 @\ 但没有成功。
去掉行与行之间的空格,并引用整个内容。 EOL 处的 \
基本上是 "escapes" 换行符,因此它不会成为字符串本身的一部分。它仅与预处理器相关:
#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 separate 字符串文字。在大多数情况下,这没什么大不了的,因为在翻译阶段,应该连接相邻的字符串文字标记:
5.1.1.2 Translation phases:
[...]
6. Adjacent string literal tokens are concatenated.
7. White-space characters separating tokens are no longer significant. Each preprocessing token is converted into a token. The resulting tokens are syntactically and semantically analyzed and translated as a translation unit.
我找不到 Meninx 提到的关于 C99 行为不同的脚注。我使用的文档 can be found here
#define EXAMPLE "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
"ccccccccccccccccccccccccccccccccccc"
"ddddddddddddddddddddddddddddddddddd"
对于上面的指令,它的替换列表仅限于 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
因为宏定义只适用于 单个逻辑行 .
此外,在 预处理.
期间,在 C 中不可能将相邻的字符串文字连接起来形成一个单独的文字C99 脚注 148:
148: Note that adjacent string literals are not concatenated into a single string literal
改为使用 backslash-newline :
#define EXAMPLE "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\
ccccccccccccccccccccccccccccccccccc\
ddddddddddddddddddddddddddddddddddd"
C99 5.1.1.2 p/2
- Each instance of a backslash character () immediately followed by a new-line character is deleted, splicing physical source lines to form logical source lines. Only the last backslash on any physical source line shall be eligible for being part of such a splice. A source file that is not empty shall end in a new-line character, which shall not be immediately preceded by a backslash character before any such splicing takes place.