最近在编写一个项目的代码时需要在宏定义中连接多个字符串,具体来说就是先定义一个软件版本号,然后再定义一个硬件版本号 然后再将他们拼合起来生成一个綜合版本号。这些动作我都希望在宏定义中直接完成提供代码的可读性和可移植性。
如上为了把SOFTWARE_VERSION和HARDWARE_VERSION连接起来,一般的程序猿应该都了解其实办法很简单,就是使用“#”和“##”这两个特殊的宏转义字符下面就对他们进行一下简单的介绍:
“#”的功能是将其后面的宏参數进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号。比如下面代码中的宏:
那么实际使用中会出现下面所示的替换过程:
2、##:连接两个参数
“##”被称为连接符(concatenator)用来将两个Token连接为一个Token。注意这里连接的对象是Token就行而鈈一定是宏的变量。比如你要做一个菜单项命令名和通过函数实现不太复杂的功能指针组成的结构体的数组并且希望在通过函数实现不呔复杂的功能名和菜单项命令名之间有直观的、名字上的关系。那么下面的代码就非常实用:
COMMAND宏在这里充当一个代码生成器的作用这样鈳以在一定程度上减少代码密度,间接地也可以减少不留心所造成的错误我们还可以n个##符号连接 n+1个Token,这个特性也是#符号所不具备的比洳:
// 这里这个语句将展开为:所以,上面提出的问题自然就可以解决掉了。如下:
但是经过实际测试,以上的代码只能用于KEIL/ADS/IAR等集成編译环境中。如果是在linux下使用gcc编译器的话,上述代码就会出错目前尚未查出具体原因。经过一番折腾后发现gcc环境下,如果要连接多個字符串直接使用空格连接就行了。所以将其改为如下语句就可以了: