xiaoyigechaos 发表于 2020-11-6 17:35:25

求助,字符串宏定义中,变量如何在宏中展开为字符串

例子程序如下,程序是网上找的,编译运行后输出的是 :
PASTE= abcdefkjSS(n)
程序源码:
#include <stdio.h>

#define PASTE(n)"abcdefkj"#n

int main()
{
    int n = 16;

    printf("PASTE= %s",PASTE(n));
    system("pause");      
    return 0;
}
也看到了这样的说法,但尝试了,DeviceID    这个是宏时,可以展开,如果定义为 int DeviceID    = 0x33;输出结果就不能展开了
/*********************************
xxx@ubuntu:~/Desktop/NXP_Demo/driver/upload/gpio$ ./test
33
0x33
xxx@ubuntu:~/Desktop/NXP_Demo/driver/upload/gpio$ gcc -o test test.c
xxx@ubuntu:~/Desktop/NXP_Demo/driver/upload/gpio$ ./test
33
DeviceID

***********************************/

#include <stdio.h>

#define DeviceID    0x33

#define ID(x)       #x

#define IDStr(x)    ID(x)

int main(void)
{
    printf("%0x\r\n", DeviceID);
    printf("%s\r\n", IDStr(DeviceID));
    return 0;
}

zhugean 发表于 2020-11-7 14:08:56

直接printf("%s\r\n", ID(DeviceID));这样行吗

t3486784401 发表于 2020-11-8 00:24:33

宏是优先于变量的,你都已经赋给 int 型变量了,运行时可能改成其他数值,还想反着回去获得最初的宏?

那还要 sscanf 干啥

xiaoyigechaos 发表于 2020-11-9 09:20:08

t3486784401 发表于 2020-11-8 00:24
宏是优先于变量的,你都已经赋给 int 型变量了,运行时可能改成其他数值,还想反着回去获得最初的宏?

那 ...

似懂非懂
仿佛是这样,宏是编译时候展开的,展开时还没有变量的概念,所以字符串无法把变量替换进去

#define PASTE(n)"abcdefkj"#n    展开后abcdefkjn,直接替换了,这个n当然不能被解析为变量了,所以我的需求是无法实现的

如果是宏 #define MIN(A,B) A < B ? A:B

程序中MIN(x,y) 会被替换为 x<y?x:y,所以这个是能解析的

xiaoyigechaos 发表于 2020-11-9 09:22:09

zhugean 发表于 2020-11-7 14:08
直接printf("%s\r\n", ID(DeviceID));这样行吗

帖子说,嵌套的宏可能解析不了,解决方法就是分开写
页: [1]
查看完整版本: 求助,字符串宏定义中,变量如何在宏中展开为字符串