当前位置: 首页 > 知识库问答 >
问题:

为什么我们不能使用预处理器来创建自定义分隔的字符串呢?

彭梓
2023-03-14
#define STR_START "
#define STR_END "

int puts(const char *);

int main() {
    puts(STR_START hello world STR_END);
}

当我用gcc编译它时(注意:与clang类似的错误),它失败了,出现了以下错误:

$ gcc test.c
test.c:1:19: warning: missing terminating " character
test.c:2:17: warning: missing terminating " character
test.c: In function ‘main’:
test.c:7: error: missing terminating " character
test.c:7: error: ‘hello’ undeclared (first use in this function)
test.c:7: error: (Each undeclared identifier is reported only once
test.c:7: error: for each function it appears in.)
test.c:7: error: expected ‘)’ before ‘world’
test.c:7: error: missing terminating " character

这有点让我困惑,所以我在预处理器中运行它:

$ gcc -E test.c
# 1 "test.c"
# 1 ""
# 1 ""
# 1 "test.c"
test.c:1:19: warning: missing terminating " character
test.c:2:17: warning: missing terminating " character

int puts(const char *);

int main() {
    puts(" hello world ");
}

尽管有警告,它仍生成完全有效的代码(粗体文本)!

共有1个答案

巫马嘉祯
2023-03-14

问题是,即使代码扩展为“hello,world”,预处理器仍不能将其识别为单个字符串文字标记;相反,它被识别为令牌,hello,,,世界,的(无效)序列。

N1570:

请注意,在此定义下,'都不是标点符号。

 类似资料:
  • 问题内容: 我必须使用字典中的值格式化字符串,但是该字符串已经包含大括号。例如: 但是,当然会导致KeyErro。 有没有办法使用不同的符号来使用? 这不是我如何在python字符串中打印文字大括号字符并在其上使用.format的重复项?因为我需要保持大括号不变,并为使用不同的定界符。 问题答案: 语境 python 2.7 允许自定义占位符语法的替代方法 问题 我们要在Python str.fo

  • 我使用Netty 4.1.16创建一个服务器。我建立一个管道: 在稍后的代码中,我将创建一个对传入消息的字符串响应,并尝试使用以下命令将其写入ChannelHandlerContext: ... 我的通灵之手是背景。writeAndFlush(字符串消息)失败,原因是 正如我所理解的文档和示例,WriteAndFlush应该向管道写入一个字符串,并且字符串编码器应该在将该字符串转发到套接字进行传输

  • 问题内容: 我们通常使用关键字创建对象,例如: 字符串是对象,但是我们不能用来创建它们: 为什么是这样?我可以用做一个琴弦吗? 问题答案: 除了已经说过的内容外,Java中的字符串文字(即像Java 一样但不喜欢的字符串)是经过内插的-这意味着,每次引用时,你都将引用一个String实例,而不是一个新实例。每一次。因此,你将拥有: 但是如果你有 那么就有可能 (如果有人需要提醒,请务必使用比较字符

  • 问题内容: 我需要在数据库中填充纬度和经度列,但是原始信息存储为单个字符串 例如。 我猜想TRIM命令在这里很有用,但是我不知道如何告诉它每半个部分都精确地停在逗号上。 我希望能够提出一个简单的UPDATE查询,如下所示: 但是显然在LTRIM和RTRIM部分中需要做一些额外的工作,因此我只选择数据,但不包括UDFChar1中的逗号。 关于如何实现这一目标的任何想法? 问题答案: 请试试: 和 样

  • 问题内容: 我想分割一个具有如下内容的字符串: 但是当我使用时: 它不能识别$并且不分割字符串,但是当我用$像X这样的字母替换$时,它可以工作。有人有什么主意吗? 问题答案: split函数需要一个正则表达式(而不是字符串)进行匹配。您的正则表达式使用特殊字符-在本例中为’$’-因此您需要对其进行更改以转义该字符: 还要注意,split返回一个字符串数组- 字符串是不可变的,因此无法修改。对Str