多行定义字符串

7

我在想如何定义一段跨越多行的超长字符串。 我尝试了很多不同的模式,但都没有成功.. 这是我的代码。

#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。

我尝试使用\和@ \,但那行不通。


2
请在 [mcve] 中演示失败情况。 - genpfault
“@” 是完全没有意义的;我不知道这个想法来自哪里。 “\” 只有在行末才有效。当你对某些“不起作用”的东西感到好奇时,你必须(a)在问题中包含精确的内容,并且(b)明确指定“不起作用”是什么意思(包括确切的错误消息,如果那是问题所在)。 - rici
请展示使用 \ 的确切代码,说明它是如何“不起作用”的。 - user3458
你真的需要在宏中使用字符串字面值吗?除非有强制性的原因需要将其提供给预处理器,否则最好将其分配给一个const char * const常量。 - Toby Speight
2个回答

13

只需删除行之间的空格,并引用整个内容。行尾处的 \ 字符基本上会将换行符“转义”,因此它不会成为字符串本身的一部分。这仅与预处理器有关:

#include <stdio.h>

#define LONG_STRING "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\
ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"

int main ( void ) {
    printf(LONG_STRING);
    return 0;
}

那很好 完全没问题

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

#define LONG_STRING "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"\
                    "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"\
                    "ccccccccccccccccccccccccccccccccccccccccccccc"

这也可以正常工作:非常好

注意:

这两个建议并不是完全等价的。第一个版本将宏定义为单个字符串文字。第二个版本将宏定义为3个独立的字符串文字。在大多数情况下,这不是什么大问题,因为在翻译阶段,相邻的字符串文字标记应该被连接在一起:

5.1.1.2 翻译阶段:
[...]
6. 相邻的字符串文字标记将被连接。
7. 分隔标记的空格字符不再重要。每个预处理标记都被转换为一个标记。生成的标记将被语法和语义分析和翻译为翻译单元。

我找不到Meninx提到的关于C99行为不同的脚注。我使用的文档可以在这里找到


成功了!谢谢你! - neko_studies_prog
@TobySpeight:你说得对,我会更新并指出潜在的陷阱。 - Elias Van Ootegem

3
#define EXAMPLE "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
                "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
                "ccccccccccccccccccccccccccccccccccc"
                "ddddddddddddddddddddddddddddddddddd"

对于上述指令,它的替换列表仅限于"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",因为宏定义仅适用于单个逻辑行。
此外,在C语言的预处理期间,无法将相邻的字符串字面量连接成一个字符串。
C99注脚148:
注意,相邻的字符串字面量不会连接成一个单独的字符串字面量。
因此,请使用反斜杠-换行符:
#define EXAMPLE "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\
ccccccccccccccccccccccccccccccccccc\
ddddddddddddddddddddddddddddddddddd"

C99 5.1.1.2 p/2

  1. 每个反斜杠字符(\)紧接着一个换行符将被删除,这样就把物理源代码行拼接成逻辑源代码行。在任何物理源代码行中,只有最后一个反斜杠符号才能成为这种拼接的一部分。在进行这种拼接之前,非空源文件必须以换行符结束,并且在该换行符之前不得立即出现反斜杠字符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接