2015-12-13 9 views
2

Я хочу включить файл и использовать определение препроцессора для пути.включить файл с препроцессором define

// in projects preprocessor definitions:  
HEADER="../somePath/theHeader.h" 

// in a file 
#include HEADER 

Это работает на Windows, но XCode жалуется об этом и не может найти файл. Замена HEADER на путь работает, поэтому файл существует. Итак, что мне не хватает?

ответ

4

Что мне не хватает?

Достаточно кавычек, возможно. В Unix вам понадобятся:

HEADER = "../somePath/theHeader.h" 

${CC} ${CFLAGS} -DHEADER='${HEADER}' -c file.cpp 

Определение макроса включает двойные кавычки. Если вы не завершаете аргумент -DHEADER в одинарных кавычках, оболочка (un) помогает удалять двойные кавычки. Поместив его в одинарные кавычки, оболочка помогает удалять одинарные кавычки, оставляя двойные кавычки для компилятора.

Правила обработки командной строки различны для Windows, а кавычки обрабатываются по-разному с помощью процессора cmd.exe.

Кстати, когда я хочу, чтобы сделать это возможным для человека, чтобы определить значение для HEADER в командной строке, я использую:

HEADER = ../somePath/theHeader.h 

${CC} ${CFLAGS} -DHEADER='"${HEADER}"' -c file.cpp 

Теперь я могу запустить:

make HEADER=/other/path/to/header.h file.o 

и оно работает. С оригинальной записи, я должен был бы написать:

make HEADER='"/other/path/to/header.h"' file.o 

или что-то подобное, которое fiddlier, и вдвойне неловко, если вы хотите использовать выходные данные команды, чтобы указать имя файла. Сравните первый вариант со вторым:

make HEADER=$(locate header.h) 
make HEADER="\"$(locate header.h)\"" 
+3

В качестве альтернативы, вы можете использовать препроцессор для вставки цитаты, которые могли бы быть меньше хлопот: '#define STRINGIFY (х) STRINGIFY_ (х)'/'#define STRINGIFY_ (x) # ​​x'/'#include STRINGIFY (HEADER)' – rici

+0

Это правда; Мне не нужно было это использовать, но он должен работать нормально. И, как вы говорите, это оборачивает цитаты в командной строке, что полезно. –

+1

@rici Ваша реклама заслуживает ответа. – Olumide