C ++ определил «макрос» виден в заголовке, но отсутствует в реализации (компоновщик сообщает о неразрешенном внешнем сообщении)

0

У меня есть класс для конкретных целей отладки, поэтому я использую его только тогда, когда вы заинтересованы в заданной функциональности

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

===main.cpp===
#define nowUseTmp
#include "tmp.h"
/*normal code which accesses tmp via macros*/
===EOF===

===tmp.h===
#ifdef nowUseTmp
/* class declaration */
/* macros to use static methods on class*/
#else
/*empty macro variants, so they may freely stay in code where needed*/
#endif
===EOF===

===tmp.cpp===
/*EXPECTED PLACE OF PROBLEM*/
#ifdef nowUseTmp
/* definitions */
#endif
===EOF===

проблема заключается в том, что когда я включаю nowUseTmp (до того, как the_very_first/each include), компоновщик сообщает о неразрешенном внешнем (например, если макрос был определен в заголовке и НЕ определен в файле cpp)

Вопрос: почему/как/что лучше подходит

Я ожидаю, что файлы cpp будут переводиться индивидуально, без знания цепочки include (таким образом, не может быть информации об определении)

Это так? Если да, то как обходиться, поэтому я могу иметь постоянные "tmp. *" Файлы между несколькими проектами и управлять включенными/отключенными отдельно для каждого проекта (т.е. Не использовать определение внутри соответствующего заголовка)

Просто для уточнения

→ когда я помещаю "#define tmpUseNow" внутри соответствующего заголовка (tmp.h), все работает нормально

→ соответствующий заголовок (tmp.h) включен из соответствующего файла определения (tmp.cpp)

→ то же поведение, протестированное с упрощенным проектом, с тремя файлами, как в примере

→ соответствующие файлы (tmp.h, tmp.cpp) предполагаются постоянными файлами, разделяемыми между многими проектами (поэтому я не вижу, как упорядочить их, чтобы включить предопределенный третий файл с определениями, которые будут индивидуальными для проектов, которые их используют)

  • 0
    Не определяйте nowUseTmp в исходном файле, а передавайте его компилятору, например -D nowUseTemp для GCC, или добавляйте его в настройки проекта в Visual Studio.
Теги:
scope
linker
c-preprocessor
macros

1 ответ

1
Лучший ответ

Да, каждый файл cpp обрабатывается независимо. Если бы я был вами, я бы включил tmp.h в tmp.cpp, и я бы всегда определял nowUseTmp в tmp.h.

  • 0
    Я принимаю это, так как я начал его использовать, даже когда я рассматриваю @JohanessS. подойти немного лучше, я нашел себя ленивым использовать его

Ещё вопросы

Сообщество Overcoder
Наверх
Меню