C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了为什么我们不能使用预处理器来创建自定义分解字符串?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我在C预处理器中玩了一下,当看起来如此简单的事情失败了:
#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 ");
}

尽管有警告,尽管生成完全有效的代码(以粗体显示)!

如果,C中的宏只是一个文本替换,为什么我的初始例子会失败?这是编译器的错误吗?如果没有,在标准中哪里有与这种情况有关的信息?

注意:我不是在寻找如何使我的初始代码段编译.我只是想了解为什么这种情况失败的信息.

解决方法

问题是即使代码扩展为“Hello,world”,它也不被预处理器识别为单个字符串文字标记;相反,它被认为是令牌的“(无效的)序列”,你好,世界“.

N1570

请注意,此定义下,“或”不是标点符号.

大佬总结

以上是大佬教程为你收集整理的为什么我们不能使用预处理器来创建自定义分解字符串?全部内容,希望文章能够帮你解决为什么我们不能使用预处理器来创建自定义分解字符串?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。