Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Почему не работают директивы препроцессора??  (Прочитано 10933 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« : 16-10-2004 08:02 » 

Вот ставлю, например, такие директивы в файле, скажем, file1.h:
Код:

#ifndef VAR1
#define VAR1

int i;

#endif

Но при включении этого файла в каждый файл проекта препроцессор игнорирует ifndef и выдает ошибку, что переменная уже определена.
Жаль
Почему директива игнорируется??
У меня есть только одно предположение, что VAR1 имеет время жизни только в пределах файла.. Но это чепуха, потому что другие глобальные константы/макросы нормально видны в других файлах.
Кто такое встречал и как обходил?
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #1 : 16-10-2004 09:58 » 

Удалось объявить глобальные переменные через static.
Но проблема с директивами осталась.
Причем все это глючит только в MSVC.
В старом добром BC++ все, вроде работало...  :?
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 17-10-2004 00:58 » 

baldr, переменную надо объявить только в одном модуле, а в заголовке объявить ее как extern int i; - никаких условий компиляции не нужно.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Alanir Alonedaw
Гость
« Ответ #3 : 17-10-2004 09:20 » new

RXL
Условия компиляции нужны, а то что нужно через extern объявлять - это правильно.
Плюс к этому могу посоветовать описывать ед. включение *.h файла не ifndef'ом, а через строка #pragma once
Т.е. вот так вот будет у тебя:
Код:

#pragma once
extern int i;
Записан
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #4 : 18-10-2004 07:00 » 

Alanir Alonedaw, это не верно
Цитата
Условия компиляции нужны
они НЕ нужны, не веришь Ага , проверь
Код:
extern int i;
extern int i;  //  это равносильно второму инклуду
extern int i;  //  это равносильно третьему инклуду
extern int i;  //  это равносильно четвертому инклуду
extern int i;  //  .....................
extern int i;  //  .....................
extern int i;  //  .....................

int i = 0;

void main()
{
   i = 8;
}

А это
Цитата
, а то что нужно через extern объявлять - это правильно
абсолютно верно

Цитата
Плюс к этому могу посоветовать описывать ед. включение *.h файла не ifndef'ом, а через строка #pragma once
#pragma once - не переносимо! поэтому НЕ советую это использовать, а если просто в ломак кадый раз писать #ifndef и ....... , то при работе в MS VS просто напишите макрос (не С++, а как хот кей)
« Последнее редактирование: 02-12-2007 10:37 от Алексей1153++ » Записан

С уважением Lapulya
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #5 : 18-10-2004 07:15 » 

Мда... Про extern я знаю. Но у меня глобальных переменных довольно много.
Сначала я так и выходил из ситуации, но когда в каждом файле стало по 10-20 extern в начале - мне это надоело. Жаль
Знаю, что глобальные переменные - зло. Но так было надо.
#pragma once тоже пробовал. Даже не замечает его...
Поэтому сбацал еще файлик, в котором были все extern, и начал ЕГО цеплять через include. То же самое кричит. Заколебал. Жаль
Как и говорил, теперь юзаю static.
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #6 : 18-10-2004 07:38 » 

не понял.... если мы пишем так
Код:
// Globals.h
extern int i;
extern int j;
extern int k;
extern int l;
потом
Код:
// Globals.cpp
#include "Globals.h"

int i;
int j;
int k;
int l;
ну и наконец юзаем это так
Код:
// use1.cpp
#include "Globals.h"

void f ()
{
  i = 7;
}
ну и пусть так
Код:
// use2.cpp
#include "Globals.h"

void f ()
{
  if (i == 7)
       DoSomeThing();
}

то все будет работать как часы!
« Последнее редактирование: 02-12-2007 10:38 от Алексей1153++ » Записан

С уважением Lapulya
Mad
Гость
« Ответ #7 : 18-10-2004 10:58 » 

Цитата: baldr
Но у меня глобальных переменных довольно много.

Вообщето, использование большего количества глобальных переменных это не лучший стиль программирования Улыбаюсь
Записан
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #8 : 18-10-2004 11:40 » 

Mad, он это знает... вот смотри
Цитата

...
Знаю, что глобальные переменные - зло. Но так было надо.
....
Записан

С уважением Lapulya
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines