Страницы

Поиск по вопросам

пятница, 2 ноября 2018 г.

Директива pragma once

Директива #pragma once распространяется на один подключаемый файл или на все?
UPDATE: Понял, она распростаняется на сам файл. Тогда почему, когда я в файле указал #pragma once и пытаюсь его подключить к другим файлам(нескольким) выдаются ошибки линковки:
1>error LNK2005: "void __cdecl logit(class std::basic_string,class std::allocator >,int,class std::basic_string,class std::allocator >)" (?logit@@YAXV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H0@Z) already defined in file2.obj 1>error LNK2005: "class std::basic_string,class std::allocator > __cdecl GetTime(void)" (?GetTime@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ) already defined in file2.obj 1>error LNK2005: "void __cdecl GetDate(void)" (?GetDate@@YAXXZ) already defined in file2.obj 1>fatal error LNK1169: one or more multiply defined symbols found


Ответ

Вы неверно понимаете эту директиву. Она распространяется на файл, в котором она определена.
То есть, ее нужно добавлять в .h файлы (те, которые подключаются с помощью #include) в самый верх. Она "эквивалентна" следующей, довольно популярной конструкции
#ifndef _GUARD_H_ #define _GUARD_H_ //код #endif
А вот проблема наблюдается потому, что Ваш h файл попадает в много разных cpp файлов. И естественно, линковщик обнаруживает много одинаковых функций и ругается. Лечиться это так. Либо просто добавьте inline к определению функции в самое начало (но это некрасиво, особенно, если функции не маленькие), либо создайте отдельный cpp файл, вынесите туда тело каждой функции, а в h файле оставьте только прототипы. Это правильный, хороший способ. Но если Ваши функции в h файле занимают по одной-две строки, то можно и через inline.

Комментариев нет:

Отправить комментарий