Загадочные макросы
От: Аноним  
Дата: 30.08.07 16:06
Оценка:
Ситуация следующая, есть библиотека, линкуется в виде DLL(хотя, я так понимаю, это не имеет значения):
//some_dll_library.h
#define LIB_CLIENT_NAME__ LIB_CLIENT_NAME        (1)
...
#define DO_SOME() doSomeImpl(LIB_CLIENT_NAME__)
...


Используется в проекте следующим образом:
//stdafx.h
#define LIB_CLIENT_NAME "Some project"
#include some_dll_library.h


Проблема в том, что макроопределение "LIB_CLIENT_NAME" не видно при компиляции stdafx.cpp в строке (1). Вопрос почему? Как в данном случае действует препроцессор? И можно ли реализовать подобное? Заранее спасибо за ответ.
Re: Загадочные макросы
От: slavo  
Дата: 30.08.07 16:35
Оценка: -1
Здравствуйте, Аноним, Вы писали:

А>Ситуация следующая, есть библиотека, линкуется в виде DLL(хотя, я так понимаю, это не имеет значения):

А>
А>//some_dll_library.h
А>#define LIB_CLIENT_NAME__ LIB_CLIENT_NAME        (1)
А>...
А>#define DO_SOME() doSomeImpl(LIB_CLIENT_NAME__)
А>...
А>


А>Используется в проекте следующим образом:

А>
А>//stdafx.h
А>#define LIB_CLIENT_NAME "Some project"
А>#include some_dll_library.h
А>


А>Проблема в том, что макроопределение "LIB_CLIENT_NAME" не видно при компиляции stdafx.cpp в строке (1). Вопрос почему? Как в данном случае действует препроцессор? И можно ли реализовать подобное? Заранее спасибо за ответ.


Если ты определил дефайн в файле stdafx.h (#define LIB_CLIENT_NAME "Some project"), а потом подключил some_dll_library.h, то дефайн
#define LIB_CLIENT_NAME "Some project"
не будет виден в some_dll_library.h.

В файле some_dll_library.h будут видны только те дефайны, которые прописаны в нем самом или которые прописаны в файлах, которые он сам включает.
Т.е. чтобы работало надо писать так

//stdafx.h
#define LIB_CLIENT_NAME "Some project"


//some_dll_library.h
#include "stdafx.h"
#define LIB_CLIENT_NAME__ LIB_CLIENT_NAME        (1)
...
#define DO_SOME() doSomeImpl(LIB_CLIENT_NAME__)
...


И везде, где надо подключать some_dll_library.h, а не stdafx.h.
Re[2]: Загадочные макросы
От: Аноним  
Дата: 30.08.07 16:41
Оценка:
Здравствуйте, slavo, Вы писали:

S>Если ты определил дефайн в файле stdafx.h (#define LIB_CLIENT_NAME "Some project"), а потом подключил some_dll_library.h, то дефайн

S>#define LIB_CLIENT_NAME "Some project"
S>не будет виден в some_dll_library.h.

S>В файле some_dll_library.h будут видны только те дефайны, которые прописаны в нем самом или которые прописаны в файлах, которые он сам включает.

S>Т.е. чтобы работало надо писать так

S>
S>//stdafx.h
S>#define LIB_CLIENT_NAME "Some project"
S>


S>
S>//some_dll_library.h
S>#include "stdafx.h"
S>#define LIB_CLIENT_NAME__ LIB_CLIENT_NAME        (1)
S>...
S>#define DO_SOME() doSomeImpl(LIB_CLIENT_NAME__)
S>...
S>


S>И везде, где надо подключать some_dll_library.h, а не stdafx.h.

Проблема в том, что файл some_dll_library.h включается в разные проекты и хотелось бы задавать LIB_CLIENT_NAME для каждого проекта в отдельности
Re[2]: Загадочные макросы
От: Roman Odaisky Украина  
Дата: 30.08.07 17:06
Оценка:
Здравствуйте, slavo, Вы писали:

S>В файле some_dll_library.h будут видны только те дефайны, которые прописаны в нем самом или которые прописаны в файлах, которые он сам включает.


?!

А как, по-твоему, взаимодействуют assert и NDEBUG?
До последнего не верил в пирамиду Лебедева.
Re[3]: Загадочные макросы
От: slavo  
Дата: 31.08.07 06:50
Оценка:
Здравствуйте, Аноним, Вы писали:

S>>И везде, где надо подключать some_dll_library.h, а не stdafx.h.

А>Проблема в том, что файл some_dll_library.h включается в разные проекты и хотелось бы задавать LIB_CLIENT_NAME для каждого проекта в отдельности

//stdafx.h
#define LIB_CLIENT_NAME "Some project"


Если пишешь в VS, то в свойствах проекта (Project->Settings->C/C++) можно указать дефайн, свой для каждого проекта или его конфигурации. И потом писать так

//stdafx.h
#ifdef MY_FIRST_PROJECT
#define LIB_CLIENT_NAME "My first project"
#endif

#ifdef MY_SECOND_PROJECT
#define LIB_CLIENT_NAME "My second project"
#endif
Re[4]: Загадочные макросы
От: Erop Россия  
Дата: 31.08.07 07:18
Оценка:
Здравствуйте, slavo, Вы писали:

S>Если пишешь в VS, то в свойствах проекта (Project->Settings->C/C++) можно указать дефайн, свой для каждого проекта или его конфигурации. И потом писать так


Да везде так или иначе в свойствах проекта можно определить саму LIB_CLIENT_NAME, или что-то, что её заменяеет
Но лучше бы разобраться что за косяк у тебя такой вышел с stdafx.h...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: Загадочные макросы
От: slavo  
Дата: 31.08.07 07:21
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Здравствуйте, slavo, Вы писали:


S>>В файле some_dll_library.h будут видны только те дефайны, которые прописаны в нем самом или которые прописаны в файлах, которые он сам включает.


RO>?!


RO>А как, по-твоему, взаимодействуют assert и NDEBUG?


NDEBUG передается компилятору в виде параметра и виден во всех файлах.
Re: Загадочные макросы
От: Vain Россия google.ru
Дата: 31.08.07 10:33
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Ситуация следующая, есть библиотека, линкуется в виде DLL(хотя, я так понимаю, это не имеет значения):

А>
А>//some_dll_library.h
А>#define LIB_CLIENT_NAME__ LIB_CLIENT_NAME        (1)
А>...
А>#define DO_SOME() doSomeImpl(LIB_CLIENT_NAME__)
А>...
А>


А>Используется в проекте следующим образом:

А>
А>//stdafx.h
А>#define LIB_CLIENT_NAME "Some project"
А>#include some_dll_library.h
А>


А>Проблема в том, что макроопределение "LIB_CLIENT_NAME" не видно при компиляции stdafx.cpp в строке (1). Вопрос почему? Как в данном случае действует препроцессор? И можно ли реализовать подобное? Заранее спасибо за ответ.

У вас эти два файла используются в Precompiled Header'е?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[4]: Загадочные макросы
От: Roman Odaisky Украина  
Дата: 31.08.07 13:02
Оценка: -1
Здравствуйте, slavo, Вы писали:

S>>>В файле some_dll_library.h будут видны только те дефайны, которые прописаны в нем самом или которые прописаны в файлах, которые он сам включает.


RO>>?!


RO>>А как, по-твоему, взаимодействуют assert и NDEBUG?


S>NDEBUG передается компилятору в виде параметра и виден во всех файлах.


#define NDEBUG
#include <assert.h>
До последнего не верил в пирамиду Лебедева.
Re[5]: Загадочные макросы
От: Roman Odaisky Украина  
Дата: 31.08.07 15:14
Оценка:
Здравствуйте, Roman Odaisky, я писали:

S>>>>В файле some_dll_library.h будут видны только те дефайны, которые прописаны в нем самом или которые прописаны в файлах, которые он сам включает.

RO>>>?!
RO>>>А как, по-твоему, взаимодействуют assert и NDEBUG?
S>>NDEBUG передается компилятору в виде параметра и виден во всех файлах.

RO>
RO>#define NDEBUG
RO>#include <assert.h>
RO>

Ну вот, сразу минусы ставить. Я понимаю, что это далеко не самый красивый способ использовать NDEBUG, но речь не о том. Как, по-твоему, будет работать такой код?
#define NDEBUG
#include <cassert>

int main()
{
    assert(0);
}
До последнего не верил в пирамиду Лебедева.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.