Подтвердить что ты не робот

Добавление котировок в аргумент в препроцессоре С++

Я хотел бы передать имя файла include в качестве аргумента компилятора, чтобы я мог изменять большое количество параметров конфигурации. Однако моя С++-сборка выполняется через make файл как процесс, который удаляет кавычки из аргументов, переданных компилятору и препроцессору. Я надеялся сделать что-то эквивалентное

#ifndef FILE_ARG
// defaults
#else
#include "FILE_ARG"
#endif

с моей командной строкой, включая -DFILE_ARG = foo.h. Это, конечно, не работает, поскольку препроцессор не переводит FILE_ARG.

Я пробовал

#define QUOTE(x) #x
#include QUOTE(FILE_ARG)

который не работает по той же причине.

По причинам сценариев я предпочел бы сделать это в командной строке, чем войти и отредактировать строку include в соответствующей процедуре. Есть ли способ?

4b9b3361

Ответ 1

Для добавления котировок вам нужен этот трюк:

#define Q(x) #x
#define QUOTE(x) Q(x)

#ifdef FILE_ARG
#include QUOTE(FILE_ARG)
#endif

Ответ 2

Вы можете сделать

#ifdef FILE_ARG
#include FILE_ARG
#endif

В командной строке

$ gcc -DFILE_ARG="\"foo.h\"" ...

должен сделать трюк.

Ответ 3

Вы также можете попробовать переключатель -include.

руководство gcc:

-ключить файл

Обработать файл так, как будто #include "file" появился как первая строка основного исходного файла. Тем не менее, первый каталог, который ищет файл, рабочий каталог препроцессора вместо каталога содержащий основной исходный файл. Если этого не найдено, поиск поскольку в остальной части #include "..." поисковая цепочка как обычно.     Если заданы параметры с несколькими включениями, файлы включаются в том порядке, в котором они отображаются в командной строке. *

Ответ 4

Работает для меня. Может быть, вы забыли правильно указать в своем Makefile?

$ cat example.c
#include FILE_ARG

$ cat test.h
#define SOMETHING

$ gcc -Wall -Wextra -W -DFILE_ARG=\"test.h\" -c example.c
$ 

EDIT: Причина, по которой вы не сможете получить котировку на работу, состоит в том, что препроцессор работает в phases. Кроме того, я использовал "gcc (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2", результаты могут различаться между компиляторами.