【问题标题】:Define multiple-word macro using -D flag with gcc使用 -D 标志和 gcc 定义多字宏
【发布时间】:2020-05-05 21:04:52
【问题描述】:

这样做的目的是使用 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.

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"

【问题讨论】:

    标签: c shell gcc macros


    【解决方案1】:

    您不需要STRINGIZE 宏。正确的命令行语法是:

    gcc -DDEBUG -DSTRING='"abc def"' program.c
    

    换句话说,您需要引用定义的宏的整个值,包括 C 字符串分隔符 (")。

    那么你可以这样做:

    printf("string: %s\n", STRING);
    

    【讨论】:

    • 谢谢!我也能够做到gcc program.c -D'DEBUG' -D'STRING="abc def"',这也很有效。由于某种原因,字符串被 shell 分解了。
    • @VictorWade 不客气。如果这有助于解决问题,您可以使用左侧的复选标记按钮将我的答案标记为已接受。
    猜你喜欢
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    相关资源
    最近更新 更多