c - 在 gcc 中使用 -D 标志定义多字宏

标签 c shell gcc macros

这样做的目的是使用 Makefile 构建一个带有命令行注入(inject)宏的程序。

我想使用多个术语定义宏,但是我得到了一个错误,因为 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.

this answer 所述,作为替代方法。

$ 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);

关于c - 在 gcc 中使用 -D 标志定义多字宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59813389/

相关文章:

c - 如何返回带数组的 C 结构体?

从整数纪元时间值转换为本地时间

c - C 中的高斯消元法

linux - 循环文本文件和 grep

c - C语言的贪吃蛇游戏

bash - d=${c//[^$b]} 如何统计字母$b在$c中出现了多少次?

linux - ". filename"从/bin/sh 运行时找不到文件,从/bin/bash 运行;为什么?

C++ 可变参数模板 : different priorities in gcc and nvcc/intel

c++ - gdb 7.5.1 调试通过 g 4.7.2 构建的可执行文件的问题

c++ - 结合使用 -fno-unwind-tables 和 -fno-exceptions