#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;
}

有效just fine

出于审美原因,您可以单独引用每一行,唯一的要求是在结束引号后直接添加 \

#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

  1. 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.