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

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

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

===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), компоновщик сообщает о неразрешенном внешнем (например, если макрос был определен в заголовке, а НЕ определен в файле cpp)

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

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

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

Просто для ясности

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

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

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

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


person chmirko    schedule 26.01.2014    source источник
comment
Не определяйте nowUseTmp в исходном файле, а передайте его компилятору, например. -D nowUseTemp для GCC или добавьте его в настройки проекта в Visual Studio.   -  person Johannes S.    schedule 26.01.2014


Ответы (2)


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

person Michael Kohne    schedule 26.01.2014
comment
Я принимаю это, поскольку именно так я начал его использовать, даже когда я думаю о @JohanessS. подход немного лучше, мне было лень его использовать - person chmirko; 23.05.2015

Вы можете добавить в свои функции tmp.cpp (назовите его use_tmp) дополнительный параметр со значением по умолчанию value = nowUseTmp и проверить его значение для определенного поведения:

тмп.ч :

/* takes par2 value from the define */
void use_tmp(int par1, int par2 = nowUseTmp);

tmp.cpp:

void use_tmp(int par1, int par2)
{
    if(!par2) /*do smth*/ return;
}

person Mikhail    schedule 18.01.2021