Объединить и структурировать значения макросов для #include - PullRequest
0 голосов
/ 09 января 2012

Я пытаюсь создать строку из нескольких макросов / значений для использования в #include.Я делаю это, чтобы очистить некоторый код для начального состояния в простой системе состояний.

У меня есть 2 переопределяемых макроса по умолчанию (если не определено, есть значение по умолчанию)

   #define DEFAULT_STATE          StateName    // name of class
   #define DEFAULT_STATE_LOCATION states/      // location of header file from root

Директива include используется из файла 4 папки из root, поэтому include должен выглядеть следующим образом

#include "../../../../states/StateName.h"

на основе приведенного выше примера.

Итак, я хочучтобы определить макрос из 4 значений.

../../../../
DEFAULT_STATE_LOCATION
DEFAULT_STATE
.h

в некоторый макрос, скажем DEFAULT_STATE_INCLUDE

, чтобы я мог сказать

#include #DEFAULT_STATE_INCLUDE
(to stringize the value for quotes)

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

Я не включаю .h в макрос DEFAULT_STATE, потому что я использую тот же макрос для создания и экземпляра состояния по умолчанию.

Я пытался использовать конкатенацию ##и оператор stringize, и некоторые трюки, которые я нашел настрока, но ничего не сработало.

Я могу определить ../../../../ и .h в их собственных макросах, если необходимо.

Но просто

    #define DEFAULT_STATE_INCLUDE ../../../../ ## DEFAULT_STATE_LOCATION ## DEFAULT_STATE ## .h
    #include #DEFAULT_STATE_INCLUDE

дает массу ошибок.

Любая помощь приветствуется.Спасибо

Ответы [ 3 ]

1 голос
/ 09 января 2012

Это представляется актуальным: Вычислено Включает

Насколько я понимаю, макрос #define должен включать символы "(кавычка), и вы не можете полагаться на операторы stringize или concatenation, чтобы сделать это за вас.

1 голос
/ 09 января 2012

Обратите внимание, что сноска 143 в разделе §6.10.2 «Включение исходного файла» стандарта C99 гласит:

143) Обратите внимание, что соседние строковые литералы не объединяются в один строковый литерал (см. Перевод фазы в 5.1.1.2); таким образом, расширение, которое приводит к двум строковым литералам, является недопустимой директивой.

Таким образом, любая конкатенация строк должна выполняться вне исходного кода. Объединение токенов с ## не вариант; который используется для создания идентификаторов, а биты имени заголовка, к которому вы присоединяетесь, не являются идентификаторами.

Я думаю, вы должны просто использовать что-то вроде:

#ifndef STATE_HEADER
#define STATE_HEADER "states/StateName.h"
#endif
#include STATE_HEADER

и предоставьте его системе сборки, а не исходному коду, чтобы определить, что -I../../../.. требуется в качестве опции для компилятора.

1 голос
/ 09 января 2012

Вам лучше передать каталог include в gcc с параметром -I

-I../../../..

со страницы руководства gcc:

-I dir
Add the directory dir to the list of directories to be searched for header files.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...