Добавление к аргументу кавычек в препроцессоре C ++ - PullRequest
21 голосов
/ 13 июля 2011

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

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

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

Я пробовал

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

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

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

Ответы [ 4 ]

32 голосов
/ 13 июля 2011

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

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

#ifdef FILE_ARG
#include QUOTE(FILE_ARG)
#endif
4 голосов
/ 13 июля 2011

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

#ifdef FILE_ARG
#include FILE_ARG
#endif

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

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

следует сделать трюк.

1 голос
/ 13 июля 2011

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

gcc manual:

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

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

0 голосов
/ 13 июля 2011

У меня работает.Может быть, вы забыли правильно цитировать в своем Makefile?

$ cat example.c
#include FILE_ARG

$ cat test.h
#define SOMETHING

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

РЕДАКТИРОВАТЬ: причина, по которой вы не сможете получить цитаты для работы, заключается в том, что препроцессор работает в фазы .Кроме того, я использовал «gcc (Ubuntu / Linaro 4.5.2-8ubuntu4) 4.5.2», результаты могут отличаться для разных компиляторов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...