我们可以使用命令的输出(带标志)作为宏预处理器(例如uname --kernel-name
)
#include <stdio.h>
#define version(v) #v
#define VERSION(v) version(v)
int main(void)
{
printf("Version: %s\n", VERSION(kernel_name));
return 0;
}
使用编译:
gcc -Wall -pedantic -o demo demo.c -Dkernel_name=$(uname --kernel-name)
输出:
Version: Linux
但是当宏开始于#
(例如uname --kernel-version
)时,这会失败:
david@debian:~$ uname --kernel-version
#1 SMP Debian 3.2.46-1+deb7u1
因为您无法定义以#
#define SOMETHING #something /* error: stray ‘#’ in program */
有引用命令输出的方法吗?
"#1 SMP Debian 3.2.46-1+deb7u1"
为了获得有效的输入?
答案 0 :(得分:1)
易。
替换
-Dkernel_name=$(uname --kernel-name)
与
-Dkernel_name="\"$(uname --kernel-name)\""
这是有效的,因为-D
标志等同于一个定义。因此,-Dvar=val
相当于您的来源中有#define var val
。
当您执行-Dkernel_name="\"$(uname --kernel-name)\""
时,您的shell会将define选项值转换为等于"#1 SMP Debian 3.2.46-1+deb7u1"
- 您的shell的一组引号和实际程序的另一组引号。这样您就不必进行字符串化。