#ifdef,#ifndef
От: NordSky Россия  
Дата: 19.08.09 09:17
Оценка:
Всем привет,у меня такой вопрос
Допустим,у меня есть (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 распространяется на весь проект или только на файл?
Вроде понятней некуда расписал
Re: #ifdef,#ifndef
От: jazzer Россия Skype: enerjazzer
Дата: 19.08.09 09:23
Оценка: 3 (1)
Здравствуйте, NordSky, Вы писали:

NS>#define распространяется на весь проект или только на файл?

только на файл.
В С++ нет понятия проекта.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: #ifdef,#ifndef
От: Bell Россия  
Дата: 19.08.09 09:29
Оценка: 1 (1)
Здравствуйте, NordSky, Вы писали:

NS>#define распространяется на весь проект или только на файл?

На файл. О какой среде разработки идет речь (это к вопросу о проекте)?
Любите книгу — источник знаний (с) М.Горький
Re[2]: #ifdef,#ifndef
От: NordSky Россия  
Дата: 19.08.09 09:32
Оценка:
Здравствуйте, Bell, Вы писали:

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


NS>>#define распространяется на весь проект или только на файл?

B>На файл. О какой среде разработки идет речь (это к вопросу о проекте)?
проект = проект VS 2005, коряво написал вопрос немног
То есть мне надо заново писать в 2.h #define something?
Re[2]: #ifdef,#ifndef
От: NordSky Россия  
Дата: 19.08.09 09:35
Оценка:
Здравствуйте, 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
Re[3]: #ifdef,#ifndef
От: jazzer Россия Skype: enerjazzer
Дата: 19.08.09 09:44
Оценка:
Здравствуйте, NordSky, Вы писали:

NS>То есть мне надо заново писать в 2.h #define something?


Да, либо вынести все общие дефайны в один файл и подключать его отовсюду.

Для совсем примитивных дефайнов можно использовать опции компилятора (обычно это -D)
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[3]: #ifdef,#ifndef
От: Chorkov Россия  
Дата: 19.08.09 09:45
Оценка:
Здравствуйте, NordSky, Вы писали:

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


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


NS>>>#define распространяется на весь проект или только на файл?

J>>только на файл.
J>>В С++ нет понятия проекта.


NS>проект = проект VS 2005, коряво написал вопрос немног

NS>То есть мне надо заново писать в 2.h #define something?

Если это something — флаг глобальных настроек, то лучше определить его в отдельном (something.h или settings.h), и включить его везде, где флаг используется. Тогда, при внесении изменений в определение something, не придется тиражировать эти изменения.
Re[2]: #ifdef,#ifndef
От: Mephisto666 Великобритания  
Дата: 19.08.09 09:49
Оценка:
Здравствуйте, jazzer, Вы писали:

NS>>#define распространяется на весь проект или только на файл?

J>только на файл.
J>В С++ нет понятия проекта.

Впрочем #define и #include C++ тоже не понимает
Компилятор С++ принимает текстовый файл исходного кода.
Директивы #define, #ifdef и пр. нужны только для препроцессора, чтобы составить окончательный вариант файла для компиляции.
Re[3]: #ifdef,#ifndef
От: jazzer Россия Skype: enerjazzer
Дата: 19.08.09 10:08
Оценка:
Здравствуйте, Mephisto666, Вы писали:

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


NS>>>#define распространяется на весь проект или только на файл?

J>>только на файл.
J>>В С++ нет понятия проекта.

M>Впрочем #define и #include C++ тоже не понимает

С++ — это язык, и директивы препроцессора — это часть языка.
А сколькими бинарниками реализован компилятор — это уже за пределами языка.

M>Компилятор С++ принимает текстовый файл исходного кода.

M>Директивы #define, #ifdef и пр. нужны только для препроцессора, чтобы составить окончательный вариант файла для компиляции.
препроцессор — это один из этапов трансляции файла, причем даже не первый.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: #ifdef,#ifndef
От: Sashaka Россия  
Дата: 19.08.09 10:18
Оценка:
Здравствуйте, 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.

Re: #ifdef,#ifndef
От: vvv104  
Дата: 19.08.09 12:07
Оценка: 3 (1)
Здравствуйте, 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 не сработает.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.