Определите макрос из нескольких слов, используя флаг -D с gcc - PullRequest
3 голосов
/ 19 января 2020

Целью этого является создание программы с макросами, введенными из командной строки, с использованием 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
}

Результаты

Как описано справочной страницей , под описанием опции -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"

1 Ответ

2 голосов
/ 19 января 2020

Вам не нужен макрос STRINGIZE. Правильный синтаксис командной строки:

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

Другими словами, вам нужно заключить в кавычки все значение определенного макроса, включая C разделители строк (").

Тогда вы можете просто сделать:

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