0

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

为了获得有效的输入?

4

1 回答 1

1

简单的。

代替

-Dkernel_name=$(uname --kernel-name)

-Dkernel_name="\"$(uname --kernel-name)\""

这是有效的,因为-D标志等同于定义。所以-Dvar=val相当于#define var val在你的源代码中有一个。

当您这样做时-Dkernel_name="\"$(uname --kernel-name)\"",您的 shell 会将定义选项值转换为相等"#1 SMP Debian 3.2.46-1+deb7u1"- 一组引号用于您的 shell,另一组用于您的实际程序。这也使您不必进行字符串化。

于 2013-10-22T10:58:08.850 回答