Russian Qt Forum
Ноябрь 23, 2024, 07:45 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] #define refedined  (Прочитано 4254 раз)
OKTA
Гость
« : Март 04, 2014, 22:20 »

Имею в проекте некоторое количество файлов. В некоторых используются макрос с одним и тем же именем, но с разными значениями типа
Код:
#define MAX 28
И при этом имею кучу ворнингов о redefined. Почему они появляются, если макросы не глобальны?
Или я что-то путаю?
« Последнее редактирование: Март 04, 2014, 22:59 от OKTA » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Март 04, 2014, 22:25 »

Почему они появляются, если макросы не глобальны?
Что значит не глобальные. Если макрос продефайнился, то он будет действовать до завершения компиляции единицы трансляции (файла) или до определения его #undef.
Записан
OKTA
Гость
« Ответ #2 : Март 04, 2014, 22:30 »

Не глобальные имел ввиду, что определив макрос в одном файле, в другом он не будет доступен.
+ Я почему-то думал, что макросы используются только для препроцессора, а компилятор уже получает код без них.
« Последнее редактирование: Март 04, 2014, 22:36 от OKTA » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #3 : Март 04, 2014, 22:37 »

Не глобальные имел ввиду, что определив макрос в одном файле, в другом он не будет доступен.
Тогда в них бы не было смысла. Улыбающийся
До появления констант в C и C++ макросами определяли общие константы и инклюдили этот файл во все нужные исходники.

+ Я почему-то думал, макросы используются только для препроцессора, а компилятор уже получает код без них.
P.S. препроцессор все таки это часть компилятора, который отрабатывает первым.
Записан
OKTA
Гость
« Ответ #4 : Март 04, 2014, 22:40 »

Ну а если я не инклудю эти файлы друг к другу?) То для каждого макрос будет свой, верно?)
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #5 : Март 04, 2014, 22:45 »

верно.

MAX задефайнен где-то в стандартной библиотеке. вообще, в наше время дефайнами константы задают довольно редко Улыбающийся
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
OKTA
Гость
« Ответ #6 : Март 04, 2014, 22:47 »

MAX это я так, для примера. Значит по поводу ворнинга можно не волноваться, если я не допускаю пересечения хеадеров, где эти макросы одноименные объявлены?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #7 : Март 04, 2014, 22:48 »

Ну а если я не инклудю эти файлы друг к другу?) То для каждого макрос будет свой, верно?)
Инклюд заменяется содержимым подключаемого файла, больше ничего не меняется.
Например:

hdr_a.h
Код
C++ (Qt)
#ifndef A_H
#define A_H
 
#define MAX    5
 
#endif
 

hdr_b.h
Код
C++ (Qt)
#ifndef B_H
#define B_H
 
#define MAX    10
 
#endif
 

main.cpp
Код
C++ (Qt)
#include "hdr_a.h"
#include "hdr_b.h"
 
int main()
{
}
 

грубо говоря развернется в
Код
C++ (Qt)
#ifndef A_H
#define A_H
 
#define MAX    5
 
#endif
 
#ifndef B_H
#define B_H
 
#define MAX    10
 
#endif
 
int main()
{
}
 

и это отдастся препроцессору, который увидит попытку переопределить MAX, о чем и скажет.
Причем, значение MAX будет содержать из последнего хедера. Если их поменять местами измениться и значение MAX.
« Последнее редактирование: Март 04, 2014, 22:50 от Old » Записан
OKTA
Гость
« Ответ #8 : Март 04, 2014, 22:59 »

Да, нашел свой косячок  Смеющийся - как раз заинклудил два файла в один))
Всем спасибо)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 1.08 секунд. Запросов: 22.