Почему #ifndef или #pragma once не спасают отalready defined
От:
Аноним
Дата:
17.06.09 10:06
Оценка:
Подключаю в некуоторых СРР-щниках некоторых хедер с некоторыми фукнкциями. При линковке одного линковщик рунается, что уже етсь такие функции. Почему #ifndef в начале этого хедера (или #pragma once) не спасают?
Re: Почему #ifndef или #pragma once не спасают отalready def
Здравствуйте, Аноним, Вы писали:
А>Подключаю в некуоторых СРР-щниках некоторых хедер с некоторыми фукнкциями. При линковке одного линковщик рунается, что уже етсь такие функции. Почему #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
Здравствуйте, Аноним, Вы писали:
А>Подключаю в некуоторых СРР-щниках некоторых хедер с некоторыми фукнкциями. При линковке одного линковщик рунается, что уже етсь такие функции. Почему #ifndef в начале этого хедера (или #pragma once) не спасают?
потому что они для компилятора (т.е. действуют в одной единице трансляции), а не для линковщика (который видит, что одно и то же попало в разные объектыне файлы, и ругается на это)
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, netch80, Вы писали:
N>>Не делайте так. Включите определения только в один.
А>Так не получается в один. Если сую этот хидер в stdafx — все равно arleady defined
Здравствуйте, jazzer, Вы писали:
А>>Подключаю в некуоторых СРР-щниках некоторых хедер с некоторыми фукнкциями. При линковке одного линковщик рунается, что уже етсь такие функции. Почему #ifndef в начале этого хедера (или #pragma once) не спасают?
J>потому что они для компилятора (т.е. действуют в одной единице трансляции), а не для линковщика (который видит, что одно и то же попало в разные объектыне файлы, и ругается на это)
Именно. Я чтоб этого не было — функции, которые имеют реализацию в *.h файлах, должны быть inline.
Re: Почему #ifndef или #pragma once не спасают отalready def
Здравствуйте, Аноним, Вы писали:
А>Подключаю в некуоторых СРР-щниках некоторых хедер с некоторыми фукнкциями. При линковке одного линковщик рунается, что уже етсь такие функции. Почему #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