有关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 打赏 收藏 转发到动态 举报
写回复
用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 的回复:
## 只能用于宏替换的串里。不能用在其它地方。 你这个,直接去掉 ## 加个空格,编译器会自动拼接相邻的字符串。
哈哈,脑袋晕了。多谢。

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧