C++ дефинира ?макро? видимо в заглавката, но липсва при внедряването (свързващото устройство съобщава за нерешени външни)

Имам някакъв клас за специфични цели за отстраняване на грешки, така че го използвам само когато се интересувам от дадена функционалност

за да предотвратя изходния боклук, когато не е необходим, се опитах да се справя с него чрез препроцесор, така че структурата е нещо подобно:

===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 файловете се превеждат индивидуално, без познаване на веригата за включване (по този начин не може да има информация за дефинирането)

така ли е Ако е така, как да заобиколно решение, така че да мога да имам постоянни файлове "tmp.*" между множество проекти и да управлявам активирани/деактивирани индивидуално за всеки проект (т.е. да не използвам define в съответната заглавка)

Само да поясня

-> когато поставя "#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 по подразбиране и да проверите неговата стойност за конкретно поведение:

tmp.h:

/* 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