Всем привет,у меня такой вопрос
Допустим,у меня есть (1.h+1.cpp) и (2.h + 2.cpp) — все в одном проекте.
Я хочу использовать (#ifdef/#ifndef + #endif) и,для примера,#define something
Вопрос — если я напишу #define something только в 1.h,то сработает ли
#ifdef something в 2.cpp,
причем,файлы ни 2.h ни 2.cpp не включают файл 1.h ?
#define распространяется на весь проект или только на файл?
Вроде понятней некуда расписал
Здравствуйте, NordSky, Вы писали:
NS>#define распространяется на весь проект или только на файл?
На файл. О какой среде разработки идет речь (это к вопросу о проекте)?
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, NordSky, Вы писали:
NS>>#define распространяется на весь проект или только на файл? B>На файл. О какой среде разработки идет речь (это к вопросу о проекте)?
проект = проект VS 2005, коряво написал вопрос немног
То есть мне надо заново писать в 2.h #define something?
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, NordSky, Вы писали:
NS>>#define распространяется на весь проект или только на файл? J>только на файл. J>В С++ нет понятия проекта.
проект = проект VS 2005, коряво написал вопрос немног
То есть мне надо заново писать в 2.h #define something?
Re[3]: #ifdef,#ifndef
От:
Аноним
Дата:
19.08.09 09:37
Оценка:
Здравствуйте, NordSky, Вы писали:
B>>На файл. О какой среде разработки идет речь (это к вопросу о проекте)?
Очевидное уточнение — на файл где объявлен define и на все, в которые он инклюдится до undef
NS>проект = проект VS 2005, коряво написал вопрос немног NS>То есть мне надо заново писать в 2.h #define something?
Или сделай отдельный config.h (для студии наверное подойдёт stdafx.h) или в настройках проекта задай его в Preprocessor-> Preprocessor Definitions
Здравствуйте, NordSky, Вы писали:
NS>Здравствуйте, jazzer, Вы писали:
J>>Здравствуйте, NordSky, Вы писали:
NS>>>#define распространяется на весь проект или только на файл? J>>только на файл. J>>В С++ нет понятия проекта.
NS>проект = проект VS 2005, коряво написал вопрос немног NS>То есть мне надо заново писать в 2.h #define something?
Если это something — флаг глобальных настроек, то лучше определить его в отдельном (something.h или settings.h), и включить его везде, где флаг используется. Тогда, при внесении изменений в определение something, не придется тиражировать эти изменения.
Здравствуйте, jazzer, Вы писали:
NS>>#define распространяется на весь проект или только на файл? J>только на файл. J>В С++ нет понятия проекта.
Впрочем #define и #include C++ тоже не понимает
Компилятор С++ принимает текстовый файл исходного кода.
Директивы #define, #ifdef и пр. нужны только для препроцессора, чтобы составить окончательный вариант файла для компиляции.
Здравствуйте, Mephisto666, Вы писали:
M>Здравствуйте, jazzer, Вы писали:
NS>>>#define распространяется на весь проект или только на файл? J>>только на файл. J>>В С++ нет понятия проекта.
M>Впрочем #define и #include C++ тоже не понимает
С++ — это язык, и директивы препроцессора — это часть языка.
А сколькими бинарниками реализован компилятор — это уже за пределами языка.
M>Компилятор С++ принимает текстовый файл исходного кода. M>Директивы #define, #ifdef и пр. нужны только для препроцессора, чтобы составить окончательный вариант файла для компиляции.
препроцессор — это один из этапов трансляции файла, причем даже не первый.
Здравствуйте, NordSky, Вы писали:
NS>Всем привет,у меня такой вопрос NS>Допустим,у меня есть (1.h+1.cpp) и (2.h + 2.cpp) — все в одном проекте. NS>Я хочу использовать (#ifdef/#ifndef + #endif) и,для примера,#define something
NS>Вопрос — если я напишу #define something только в 1.h,то сработает ли
NS>#ifdef something в 2.cpp, NS>причем,файлы ни 2.h ни 2.cpp не включают файл 1.h ?
NS>#define распространяется на весь проект или только на файл? NS>Вроде понятней некуда расписал
читаем MSDN:
Preprocessor directives can appear anywhere in a source file, but they apply only to the remainder of the source file.
Здравствуйте, NordSky, Вы писали:
NS>Всем привет,у меня такой вопрос NS>Допустим,у меня есть (1.h+1.cpp) и (2.h + 2.cpp) — все в одном проекте. NS>Я хочу использовать (#ifdef/#ifndef + #endif) и,для примера,#define something
NS>Вопрос — если я напишу #define something только в 1.h,то сработает ли
NS>#ifdef something в 2.cpp, NS>причем,файлы ни 2.h ни 2.cpp не включают файл 1.h ?
NS>#define распространяется на весь проект или только на файл? NS>Вроде понятней некуда расписал
Проект — вещь зависимая от среды разработки. Вопрос про директивы препроцессора. В общем случае в проекте описывается какие файлы обрабатывать компилятором, каким образом их линковать и с какими опциями производить все операции. Как правило обрабатываются все файлы c (cpp) отдельно. Сначала прероцессором. Встретив директиву #include представьте себе, что просто происходит вставка всего содержимого файла из #include в обрабатываемый файл. Далее каждый таким образом обработанный файл скармливается компилятору, в результате чего создается т. н. единица трансляции, которые в свою очередь объединяются (linking) в исполняемый код. Директива препроцессора распространяется на единицу трансляции, но с того момента как объявлена. То есть там где пишется #include — в то место и ставится код, где написан #define начиная с того момента и будет это определение. Соответственно в Вашем случае #define из 1.h не попадет в единицу трансляции 2.cpp и #ifdef не сработает.