Почему #ifndef или #pragma once не спасают отalready defined
От: Аноним  
Дата: 17.06.09 10:06
Оценка:
Подключаю в некуоторых СРР-щниках некоторых хедер с некоторыми фукнкциями. При линковке одного линковщик рунается, что уже етсь такие функции. Почему #ifndef в начале этого хедера (или #pragma once) не спасают?
Re: Почему #ifndef или #pragma once не спасают отalready def
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 17.06.09 10:08
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Подключаю в некуоторых СРР-щниках некоторых хедер с некоторыми фукнкциями. При линковке одного линковщик рунается, что уже етсь такие функции. Почему #ifndef в начале этого хедера (или #pragma once) не спасают?


Потому что они действуют на один модуль, а дерутся определения из разных модулей.

Не делайте так. Включите определения только в один.
The God is real, unless declared integer.
Re[2]: Почему #ifndef или #pragma once не спасают отalready
От: Аноним  
Дата: 17.06.09 10:12
Оценка:
Здравствуйте, netch80, Вы писали:

N>Не делайте так. Включите определения только в один.


Так не получается в один. Если сую этот хидер в stdafx — все равно arleady defined
Re: Почему #ifndef или #pragma once не спасают отalready def
От: jazzer Россия Skype: enerjazzer
Дата: 17.06.09 10:14
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Подключаю в некуоторых СРР-щниках некоторых хедер с некоторыми фукнкциями. При линковке одного линковщик рунается, что уже етсь такие функции. Почему #ifndef в начале этого хедера (или #pragma once) не спасают?


потому что они для компилятора (т.е. действуют в одной единице трансляции), а не для линковщика (который видит, что одно и то же попало в разные объектыне файлы, и ругается на это)
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]: Почему #ifndef или #pragma once не спасают отalready
От: jazzer Россия Skype: enerjazzer
Дата: 17.06.09 10:22
Оценка:
Здравствуйте, Аноним, Вы писали:

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


N>>Не делайте так. Включите определения только в один.


А>Так не получается в один. Если сую этот хидер в stdafx — все равно arleady defined


в один объектник! а не в один хедер.
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[2]: Почему #ifndef или #pragma once не спасают отalready
От: Kh_Oleg  
Дата: 17.06.09 10:43
Оценка:
Здравствуйте, jazzer, Вы писали:

А>>Подключаю в некуоторых СРР-щниках некоторых хедер с некоторыми фукнкциями. При линковке одного линковщик рунается, что уже етсь такие функции. Почему #ifndef в начале этого хедера (или #pragma once) не спасают?


J>потому что они для компилятора (т.е. действуют в одной единице трансляции), а не для линковщика (который видит, что одно и то же попало в разные объектыне файлы, и ругается на это)


Именно. Я чтоб этого не было — функции, которые имеют реализацию в *.h файлах, должны быть inline.
Re: Почему #ifndef или #pragma once не спасают отalready def
От: Bell Россия  
Дата: 17.06.09 10:49
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Подключаю в некуоторых СРР-щниках некоторых хедер с некоторыми фукнкциями. При линковке одного линковщик рунается, что уже етсь такие функции. Почему #ifndef в начале этого хедера (или #pragma once) не спасают?


Потому что #ifndefи #pragma once спасают вот от такого:
//file.h
#pragma once
int func();

struct test{};

//file.cpp
#include "file.h"
#include "file.h"

//без pragma once получил бы от компилятора за повторное объявление struct

т.е. от повторного включения заголовка в одну и ту же единицу трансляции.

Твоя проблема в том, что у тебя в заголовке лежат определения функций.
Любите книгу — источник знаний (с) М.Горький
Re[3]: Почему #ifndef или #pragma once не спасают отalready
От: Аноним  
Дата: 17.06.09 13:22
Оценка:
K_O>Именно. Я чтоб этого не было — функции, которые имеют реализацию в *.h файлах, должны быть inline.
или static
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.