求助c语言宏连接问题
#define A 1
#define B 2
#define C 3
int main(int argc, char* argv[])
{
printf("%s\n",XX);
return 0;
}
在printf用宏A B C,打印出1.2.3。
请问谁知道这道题目怎么做?
多谢!!!
[解决办法]
#include <stdio.h>
#define A 1
#define B 2
#define C 3
#define Y(a,b,c) a##.##b##.##c
#define X(s) #s
#define XX(s) X(s)
int main()
{
printf("%s\n",XX(Y(A,B,C)));
return 0;
}
#include <stdio.h>
#define A 1
#define B 2
#define C 3
int main(int argc, char* argv[])
{
printf("%s\n", &printf("%d.%d.%d", A, B, C)["A#B#C"]);
return 0;
}
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文件)
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
[解决办法]
楼上的几位都写的太冗余了,不需要那么多的代码的
#include <stdio.h>
#define A(a,b,c) printf("%d.%d.%d\n",a,b,c);
int main(void)
{
A(1,2,3);
return 0;
}