使用-D引用宏预处理器

时间:2013-10-22 10:44:45

标签: c bash macros c-preprocessor

我们可以使用命令的输出(带标志)作为宏预处理器(例如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"

为了获得有效的输入?

1 个答案:

答案 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的一组引号和实际程序的另一组引号。这样您就不必进行字符串化。