C 使用-D引用宏预处理器

C 使用-D引用宏预处理器,c,bash,macros,c-preprocessor,C,Bash,Macros,C Preprocessor,我们可以使用命令的输出(带有标志)作为宏预处理(例如uname--kernelname) 输出: Version: Linux 但是,当宏以#开头时(例如uname——内核版本)会失败: 因为您不能定义以# 有没有办法引用命令的输出 "#1 SMP Debian 3.2.46-1+deb7u1" 为了获得有效的输入?简单 替换 -Dkernel_name=$(uname --kernel-name) 与 这是因为-D标志相当于定义。因此-Dvar=val相当于在源代码中有一个#define

我们可以使用命令的输出(带有标志)作为宏预处理(例如
uname--kernelname

输出:

Version: Linux
但是,当宏以
#
开头时(例如
uname——内核版本
)会失败:

因为您不能定义以
#

有没有办法引用命令的输出

"#1 SMP Debian 3.2.46-1+deb7u1"
为了获得有效的输入?

简单

替换

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

这是因为
-D
标志相当于定义。因此
-Dvar=val
相当于在源代码中有一个
#define var val


当您执行
-Dkernel\u name=“\”$(uname-内核名)\”
时,您的shell将define选项值转换为等于
“\1 SMP Debian 3.2.46-1+deb7u1”
——一组引号用于shell,另一组引号用于实际程序。这样你就不用再把它串起来了。

我真蠢!!,工作起来很有魅力,我试着
“$(uname--kernel name)”
是的,你忘了转义:)
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"
-Dkernel_name=$(uname --kernel-name)
-Dkernel_name="\"$(uname --kernel-name)\""