我想知道如何使用C预处理器将一个#define‘d的int连接到一个#define’d的字符串.我的编译器是CentOS5上的GCC 4.1.这个解决方案应该也适用于MinGW.

我想在字符串上附加一个版本号,但我能让它工作的唯一方法是复制定义为字符串的版本号.

我能找到的最接近的是一种引用宏参数的方法,但它不适用于#define

这是行不通的.

#define MAJOR_VER 2
#define MINOR_VER 6
#define MY_FILE "/home/user/.myapp" #MAJOR_VER #MINOR_VER

没有#也不行,因为值是数字,它会扩展到"/home/user/.myapp" 2 6,这不是有效的C.

这确实有效,但我不喜欢有版本定义的副本,因为我也需要它们.

#define MAJOR_VER 2
#define MINOR_VER 6
#define MAJOR_VER_STR "2"
#define MINOR_VER_STR "6"
#define MY_FILE "/home/user/.myapp" MAJOR_VER_STRING MINOR_VER_STRING

推荐答案

classic 的C预处理器问题....

#define STR_HELPER(x) #x
#define STR(x) STR_HELPER(x)

#define MAJOR_VER 2
#define MINOR_VER 6
#define MY_FILE "/home/user/.myapp" STR(MAJOR_VER) STR(MINOR_VER)

额外的间接寻址级别将允许预处理器在宏转换为字符串之前展开宏.

C++相关问答推荐

当我try 计算一个多项时,看到segfault.我做错了什么?

C限制限定符是否可以通过指针传递?

为什么getchar()挂起了,尽管poll()返回了一个好的值?""

为什么下面的递归基本情况在C中不起作用?

Ruby C Api处理异常

Linux不想运行编译后的文件

指向不同类型的指针是否与公共初始序列规则匹配?

我在反转双向链表时遇到问题

理解bzip2的BZ2_解压缩函数中的状态重新分配

为什么Linux无法映射这个PT_LOAD ELF段?

静态初始化顺序失败是否适用于C语言?

浮动目标文件,数据段

Leet代码运行时错误:代码不会在Leet代码上编译,而是在其他编译器中编译,如netbeans和在线编译器

C程序printf在getchar while循环后不工作

UpDown控制与预期相反

我可以使用Windows SDK';s IN6_IS_ADDR_LOOPBACK等,尽管没有文档?

If语句默认为true

gdb - 你能找到持有内部 glibc 锁的线程吗?

我正在使用 klib 库 我可以使用 (khash) KHASH_SET_INIT_INT64() 负值作为键.因为我在头文件中看到它使用 unsigned long int

为什么孤儿进程在 Linux 中没有被 PID 1 采用,就像我读过的一本书中声称的那样?