社区
C语言
帖子详情
有关C语言连字符##使用
shinerise
2015-12-02 11:47:56
我有一段代码,
#define STR1 "str1"
#define STR2 "str2"
uint8_t *pucStr = STR1##STR2;
结果居然编译不过,说什么:error: stray '##' in program
想问一下大侠,我的##连字符是连接了2个宏啊,没用于变量啊,为啥编译不过呢?我用的是gcc编译器。
有了解的帮忙解答一下,多谢多谢。
...全文
340
3
打赏
收藏
有关C语言连字符##使用
我有一段代码, #define STR1 "str1" #define STR2 "str2" uint8_t *pucStr = STR1##STR2; 结果居然编译不过,说什么:error: stray '##' in program 想问一下大侠,我的##连字符是连接了2个宏啊,没用于变量啊,为啥编译不过呢?我用的是gcc编译器。 有了解的帮忙解答一下,多谢多谢。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
3 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
赵4老师
2015-12-02
打赏
举报
回复
#与##在宏定义中的--宏展开 #include <stdio.h> #define f(a,b) a##b #define g(a) #a #define h(a) g(a) int main() { printf("%s\n", h(f(1,2))); // 12 printf("%s\n", g(f(1,2))); // f(1,2) return 0; } 宏展开时: 如果宏定义以#开头,不展开参数,直接替换。 故g(f(1,2))--->#f(1,2)--->"f(1,2)"; 如果宏定义不以#开头,展开参数,直接替换,由外层向里层,如果碰到的是#开头的宏,不继续往里层展开,往外层展开。 由外层向里层,如果碰到的是以非#开头的宏,继续往里层走,直至最里层,开始一层层往外层展开。 故h(f(1,2))--->h(12)--->g(12)---->#12----->"12"。 PS: ##在宏中定义,是字符连接符 如a##b##c 等同于 "abc" #在宏开头出现,是表示宏展开的方式不同 #a 等同于"a" #abc 等同于 "abc" 复杂的: #include <stdio.h> #define f(a,b) a##b #define g(a) #a #define h(a) g(a) int main() { char a = 'a'; cout<<g(a)<<endl; // a cout<<g(g(a))<<endl; // a printf("%s\n", h(f(1,2))); // 12 printf("%s\n", g(f(1,2))); // f(1,2) printf("%s\n", g(h(f(1,2)))); // h(f(1,2)) printf("%s\n", h(g(f(1,2)))); // "f(1,2)" printf("%s\n", h(h(f(1,2)))); // "12" system("pause"); return 0; } 预处理后的:(在编译选项中添加/EP /P后编译生成的.i文件。gcc加-E) int main() { char a = 'a'; cout<<"a"<<endl; cout<<"g(a)"<<endl; printf("%s\n", "12"); printf("%s\n", "f(1,2)"); printf("%s\n", "h(f(1,2))"); printf("%s\n", "\"f(1,2)\""); printf("%s\n", "\"12\""); system("pause"); return 0; } --------------------------------------------------- 宏解析 1. ##操作符 ##操作符它的作用是在替代表中将其前后的参数连接成为一个预处理符号,它不能出现于宏替代表的开端和末尾。 例: #define concat(s,t) s##t #define AAA ABC concat(A, AA) 将被替换成 ABC 2. 重新扫描和替换 在替换列表中的所有参数替换过之后,预处理器将对结果token序列重新扫描以便对其中的宏再次替换。 当正在替换的宏在其替换列表中发现自身时,就不再对其进行替换。在任何正在嵌套替换的宏的替换过程中遇到正被替换的宏就对其不再进行替换(防止递归)。 例: #define ROOT AAA CCC #define AAA ROOT ROOT 将被替换成 ROOT CCC
fefe82
2015-12-02
打赏
举报
回复
## 只能用于宏替换的串里。不能用在其它地方。 你这个,直接去掉 ## 加个空格,编译器会自动拼接相邻的字符串。
shinerise
2015-12-02
打赏
举报
回复
引用 1 楼 fefe82 的回复:
## 只能用于宏替换的串里。不能用在其它地方。 你这个,直接去掉 ## 加个空格,编译器会自动拼接相邻的字符串。
哈哈,脑袋晕了。多谢。
C语言
系列之
字符
串相关算法
尹成老师带你步入 C 语言的殿堂,讲课生动风趣、深入浅出,全套视频内容充实,整个教程以 C 语言为核心,完整精彩的演练了数据结构、算法、设计模式、数据库、大数据高并发检索、文件重定向、多线程同步、进程通讯、...
C语言
中关于###的几个理解
C语言
# ##的
使用
理解
C语言
中的#,##
c语言
之#和 https://blog.csdn.net/liming0931/article/details/99706615
C语言
中的#,## https://blog.csdn.net/ce123_zhouwei/article/details/8961518 今天在分析一份源码的时候遇到了如下代码:#define CASE(x...
C语言
(##)连接符号的简单
使用
C语言
##符号的
使用
C语言
中的#和##表示的意义
首先,我们平常在
C语言
中写的‘#’就是将其后面的宏参数变成一个
字符
串,而‘##’是将两个宏参数粘合在一起。具体
使用
看下面: #include <iostream> #include <stdio.h> using namespace std; #...
C语言
69,382
社区成员
243,073
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章