在 gcc 中使用 -D 标志定义多字宏
Define multiple-word macro using -D flag with gcc
这样做的目的是使用 Makefile 构建一个带有命令行注入宏的程序。
我想使用多个术语定义宏,但是我得到了一个错误,因为字符串的后续部分被 gcc
.
视为文件
我需要的例子如下:
#define ULL unsigned long long
#define T_ULL typedef unsigned long long ull_t
因此,我只能创建每个定义包含 1 个术语的宏。
后一种尝试允许我创建参数化宏,但是每个定义也仅限于 1 个术语。
尝试的解决方案
#include <stdio.h>
#define _STRINGIZE(x) #x
#define STRINGIZE(x) _STRINGIZE(x)
int main(void)
{
# ifdef DEBUG
# ifdef STRING
printf("%s", "A STRING macro was defined.\n");
printf("string: %s\n", STRINGIZE(STRING));
# else
printf("%s\n", "A DEBUG macro was defined.");
# endif
# endif
}
结果
如the man page所述,在-D选项说明下。
$ gcc define.c -D='DEBUG' ; ./a.out
A DEBUG macro was defined.
如 所述,作为替代方法。
$ gcc define.c -D'DEBUG' ; ./a.out
A DEBUG macro was defined.
$ gcc define.c -D'DEBUG' -D'STRING="abc"' ; ./a.out
A STRING macro was defined.
string: "abc"
$ gcc define.c -D'DEBUG' -D'STRING="abc efg"' ; ./a.out
clang: error: no such file or directory: 'efg"'
A STRING macro was defined.
string: "abc"
$ gcc define.c -D'DEBUG' -D'STRING="abc efg hij"' ; ./a.out
clang: error: no such file or directory: 'efg'
clang: error: no such file or directory: 'hij"'
A DEBUG macro was defined.
string: "abc"
您不需要 STRINGIZE
宏。正确的命令行语法是:
gcc -DDEBUG -DSTRING='"abc def"' program.c
换句话说,您需要引用定义宏的整个值,包括 C 字符串分隔符 ("
)。
那么你可以这样做:
printf("string: %s\n", STRING);
这样做的目的是使用 Makefile 构建一个带有命令行注入宏的程序。
我想使用多个术语定义宏,但是我得到了一个错误,因为字符串的后续部分被 gcc
.
我需要的例子如下:
#define ULL unsigned long long
#define T_ULL typedef unsigned long long ull_t
因此,我只能创建每个定义包含 1 个术语的宏。
后一种尝试允许我创建参数化宏,但是每个定义也仅限于 1 个术语。
尝试的解决方案
#include <stdio.h>
#define _STRINGIZE(x) #x
#define STRINGIZE(x) _STRINGIZE(x)
int main(void)
{
# ifdef DEBUG
# ifdef STRING
printf("%s", "A STRING macro was defined.\n");
printf("string: %s\n", STRINGIZE(STRING));
# else
printf("%s\n", "A DEBUG macro was defined.");
# endif
# endif
}
结果
如the man page所述,在-D选项说明下。
$ gcc define.c -D='DEBUG' ; ./a.out
A DEBUG macro was defined.
如
$ gcc define.c -D'DEBUG' ; ./a.out
A DEBUG macro was defined.
$ gcc define.c -D'DEBUG' -D'STRING="abc"' ; ./a.out
A STRING macro was defined.
string: "abc"
$ gcc define.c -D'DEBUG' -D'STRING="abc efg"' ; ./a.out
clang: error: no such file or directory: 'efg"'
A STRING macro was defined.
string: "abc"
$ gcc define.c -D'DEBUG' -D'STRING="abc efg hij"' ; ./a.out
clang: error: no such file or directory: 'efg'
clang: error: no such file or directory: 'hij"'
A DEBUG macro was defined.
string: "abc"
您不需要 STRINGIZE
宏。正确的命令行语法是:
gcc -DDEBUG -DSTRING='"abc def"' program.c
换句话说,您需要引用定义宏的整个值,包括 C 字符串分隔符 ("
)。
那么你可以这样做:
printf("string: %s\n", STRING);