Russian Qt Forum

Программирование => С/C++ => Тема начата: OKTA от Март 04, 2014, 22:20



Название: [РЕШЕНО] #define refedined
Отправлено: OKTA от Март 04, 2014, 22:20
Имею в проекте некоторое количество файлов. В некоторых используются макрос с одним и тем же именем, но с разными значениями типа
Код:
#define MAX 28
И при этом имею кучу ворнингов о redefined. Почему они появляются, если макросы не глобальны?
Или я что-то путаю?


Название: Re: #define refedined
Отправлено: Old от Март 04, 2014, 22:25
Почему они появляются, если макросы не глобальны?
Что значит не глобальные. Если макрос продефайнился, то он будет действовать до завершения компиляции единицы трансляции (файла) или до определения его #undef.


Название: Re: #define refedined
Отправлено: OKTA от Март 04, 2014, 22:30
Не глобальные имел ввиду, что определив макрос в одном файле, в другом он не будет доступен.
+ Я почему-то думал, что макросы используются только для препроцессора, а компилятор уже получает код без них.


Название: Re: #define refedined
Отправлено: Old от Март 04, 2014, 22:37
Не глобальные имел ввиду, что определив макрос в одном файле, в другом он не будет доступен.
Тогда в них бы не было смысла. :)
До появления констант в C и C++ макросами определяли общие константы и инклюдили этот файл во все нужные исходники.

+ Я почему-то думал, макросы используются только для препроцессора, а компилятор уже получает код без них.
P.S. препроцессор все таки это часть компилятора, который отрабатывает первым.


Название: Re: #define refedined
Отправлено: OKTA от Март 04, 2014, 22:40
Ну а если я не инклудю эти файлы друг к другу?) То для каждого макрос будет свой, верно?)


Название: Re: #define refedined
Отправлено: kambala от Март 04, 2014, 22:45
верно.

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


Название: Re: #define refedined
Отправлено: OKTA от Март 04, 2014, 22:47
MAX это я так, для примера. Значит по поводу ворнинга можно не волноваться, если я не допускаю пересечения хеадеров, где эти макросы одноименные объявлены?


Название: Re: #define refedined
Отправлено: Old от Март 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.


Название: Re: #define refedined
Отправлено: OKTA от Март 04, 2014, 22:59
Да, нашел свой косячок  ;D - как раз заинклудил два файла в один))
Всем спасибо)