powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / #pragma once НЕ РАБОТАЕТ?
24 сообщений из 24, страница 1 из 1
#pragma once НЕ РАБОТАЕТ?
    #32340389
AlexeyEvt2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проект С++ Visual Studio .Net состоит из нескольких .CPP файлов и
одного заголовочного (Common.h).
Во всех .CPP файлах происходит подключение заголовочного файла:
#include "common.h"

Для того, чтобы файл common.h включался один раз, включаю в файл
строчку:
#pragma once

Однако, при сборке проекта, если в файле Common.h содержится
ошибка, то она выводится при компиляции каждого .CPP файла.

Получается, #pragma once не работает? Или может в свойствах
проекта какая настройка есть?

P.S. пробовал в Common.h писать

#ifndef __COMMON_H__
#define __COMMON_H__ 1
#endif

но результат тот же.
...
Рейтинг: 0 / 0
#pragma once НЕ РАБОТАЕТ?
    #32340409
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Common.h должен быть написан так
Код: plaintext
1.
2.
3.
4.
5.
6.
#ifndef __COMMON_H__ 
#define __COMMON_H__ 

ЗДЕСЬ ИДЕТ ТЕКСТ ФАЙЛА

#endif


А
Код: plaintext
1.
#ifndef __COMMON_H__ 
#define __COMMON_H__  1  

неверно
...
Рейтинг: 0 / 0
#pragma once НЕ РАБОТАЕТ?
    #32340414
AlexeyEvt2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И так пробовал, результат тот же
...
Рейтинг: 0 / 0
#pragma once НЕ РАБОТАЕТ?
    #32340432
Tracer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что ты хочешь ? Ведь этот файл не скомпилился, компилятор не пометил его как "скомпилированный", и каждый раз пытается его скомпилировать.

Пытаясь скомпилировать неоткопилированную компилятину, компилятор компилирует ...
...
Рейтинг: 0 / 0
#pragma once НЕ РАБОТАЕТ?
    #32340449
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
БЫТЬ такого не может - при правильно указании #ifndef ... #endif файл включается только если он уже не был включен

Опишите что происходит - что пишет копилятор?
...
Рейтинг: 0 / 0
#pragma once НЕ РАБОТАЕТ?
    #32340456
AlexeyEvt2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> А что ты хочешь ? Ведь этот файл не скомпилился, компилятор
> не пометил его как "скомпилированный", и каждый раз пытается
> его скомпилировать.

Я так понимаю, что компиляция проходит так:
берется .CPP файл проекта, препроцессор проходит по файлу, и если
встречает #include "common.h", механически вставляет содержимое.
.CPP файл компилируется, соответственно "выполняется" строчка
#define __COMMON_H__.

При пробежке по следующему файлу, прекомпилятор снова открывает
common.h и видя строчку #ifndef __COMMON_H__ , содержимое файла
игнорирует и соответствено к моменту компиляции второго .CPP файла
он не содержит данных из common.h и нет повода выдавать те же ошибки
...
Рейтинг: 0 / 0
#pragma once НЕ РАБОТАЕТ?
    #32340481
AlexeyEvt2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Опишите что происходит - что пишет копилятор?

Вот например, при включении в common.h строчки
HINSTANCE hInstance;
выдается сообщение:


--------------------Configuration: DesignWnd - Win32 Debug--------------------
Compiling...
DsgnForm.cpp
Linking...
LINK : LNK6004: DesignWnd___Win32_Debug/DesignWnd.exe not found or not built by the last incremental link; performing full link
DsgnForm.obj : error LNK2005: "struct HINSTANCE__ * hInstance" (?hInstance@@3PAUHINSTANCE__@@A) already defined in Common.obj
MainWnd.obj : error LNK2005: "struct HINSTANCE__ * hInstance" (?hInstance@@3PAUHINSTANCE__@@A) already defined in Common.obj
...
Error executing link.exe.

DesignWnd.exe - 11 error(s), 0 warning(s)
...
Рейтинг: 0 / 0
#pragma once НЕ РАБОТАЕТ?
    #32341113
Ой Вэй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexeyEvt2
При пробежке по следующему файлу, прекомпилятор снова открывает
common.h и видя строчку #ifndef __COMMON_H__ , содержимое файла
игнорирует

Нет, каждый файл транслируется отдельно. У следующего файла свой собственный набор #define'd символов, и __COMMON_H__ у него НЕ #define'd.

#pragma once и эта конструкция с #define предназначена для случая, когда при проходе препроцессора по ОДНОМУ И ТОМУ ЖЕ файлу .cpp один и тот же .h-файл #include-ится дважды.
Например, в a.cpp есть #include "b1.h" и #include "b2.h", а в b1.h и в b2.h есть #include "a.h". Тогда a.h попадёт в a.cpp дважды, если в a.h нет #pragma once.

---------------------------------------------------------------
Теперь как бороться с твоей проблемой.
Ты поступил не совсем хорошо, когда поместил в заголовочный файл не просто заявку, что мол, будет такая переменная, а реальное объявление этой переменной.

Лечится это так:
1) в .h-файл пишется
extern HINSTANCE hInstance;

2) в ТОЛЬКО ОДИН .cpp-файл пишется
HINSTANCE hInstance;

Всё перетранслировать и привет.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
#pragma once НЕ РАБОТАЕТ?
    #34626852
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой Вэй AlexeyEvt2
При пробежке по следующему файлу, прекомпилятор снова открывает
common.h и видя строчку #ifndef __COMMON_H__ , содержимое файла
игнорирует

Нет, каждый файл транслируется отдельно. У следующего файла свой собственный набор
Код: plaintext
#define
'd символов, и
Код: plaintext
__COMMON_H__
у него НЕ
Код: plaintext
#define
'd.

#pragma once и эта конструкция с #define предназначена для случая, когда при проходе препроцессора по ОДНОМУ И ТОМУ ЖЕ файлу .cpp один и тот же .h-файл #include-ится дважды.
Например, в a.cpp есть #include "b1.h" и #include "b2.h", а в b1.h и в b2.h есть #include "a.h". Тогда a.h попадёт в a.cpp дважды, если в a.h нет #pragma once.


Зачем тогда вообще пишут эту конструкцию, если транслируется отдельно и она не спасает?

#ifndef __COMMON_H__

#define __COMMON_H__
текст
#endif
...
Рейтинг: 0 / 0
#pragma once НЕ РАБОТАЕТ?
    #34626874
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tubrik
Зачем тогда вообще пишут эту конструкцию, если транслируется отдельно и она не спасает?

#ifndef __COMMON_H__

#define __COMMON_H__
текст
#endif

чтобы в единицу компиляции 2 раза не попадали одни и теже объявления и описания.
...
Рейтинг: 0 / 0
#pragma once НЕ РАБОТАЕТ?
    #34626919
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
значит #pragma once и конструкция с #define взаимозаменяемы?
...
Рейтинг: 0 / 0
#pragma once НЕ РАБОТАЕТ?
    #34626952
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tubrikзначит #pragma once и конструкция с #define взаимозаменяемы?

Да, на компиляторах, которые поддерживают эту pragma-у с once.

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

Поэтому define более переносимое решение.
...
Рейтинг: 0 / 0
#pragma once НЕ РАБОТАЕТ?
    #34627728
grieg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ППКС Akh

Интерпретация #pragma как раз отводится на усмотрение компиляторов. Поэтому
#pragma once более лаконично, но не переносимо

С #define переносимо.

С
Код: plaintext
1.
#define __COMMON_H__  1  
тоже будет работать, потому как __COMMON_H__ определено. Просто определять ее едничкой излишне.
...
Рейтинг: 0 / 0
#pragma once НЕ РАБОТАЕТ?
    #34627836
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
griegППКС Akh ...

Да, в стандарте про прагму сказано лишь:

16.6 2003
A preprocessing directive ... causes the implementation to behave in an implementation-defined manner. Any pragma that is not recognized by the implementation is ignored.


Т.е. прагма введена только как токин для не определенных стандартом поведений компилятора и не более того. Соотстветсвенно, по стандарту, а значит для общего случая, она не переносима.
...
Рейтинг: 0 / 0
#pragma once НЕ РАБОТАЕТ?
    #34629048
Akh griegППКС Akh ...

Да, в стандарте про прагму сказано лишь:

16.6 2003
A preprocessing directive ... causes the implementation to behave in an implementation-defined manner. Any pragma that is not recognized by the implementation is ignored.


Т.е. прагма введена только как токин для не определенных стандартом поведений компилятора и не более того. Соотстветсвенно, по стандарту, а значит для общего случая, она не переносима.

Попробую заменить директиву #include на директиву #import
Это как в Java. У меня работало нормально и на Си.
...
Рейтинг: 0 / 0
#pragma once НЕ РАБОТАЕТ?
    #34629100
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh Tubrikзначит #pragma once и конструкция с #define взаимозаменяемы?

Да, на компиляторах, которые поддерживают эту pragma-у с once.


Есть нюанс :) pragma once защищает именно ФАЙЛ, конструкция с ifdef защищает КУСОК КОДА.
Был у нас случай, когда один h-ник в двух разных папках по ошибке валялся
...
Рейтинг: 0 / 0
#pragma once НЕ РАБОТАЕТ?
    #34629105
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чередник ОлегПопробую заменить директиву #include на директиву #import
Это как в Java. У меня работало нормально и на Си.

Ээээ ... Вы вообще в курсе для чего используется #import ???
...
Рейтинг: 0 / 0
#pragma once НЕ РАБОТАЕТ?
    #34629219
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чередник Олег Akh griegППКС Akh ...

Да, в стандарте про прагму сказано лишь:

16.6 2003
A preprocessing directive ... causes the implementation to behave in an implementation-defined manner. Any pragma that is not recognized by the implementation is ignored.


Т.е. прагма введена только как токин для не определенных стандартом поведений компилятора и не более того. Соотстветсвенно, по стандарту, а значит для общего случая, она не переносима.

Попробую заменить директиву #include на директиву #import
Это как в Java. У меня работало нормально и на Си.

А я попробую list на vector поменять... Вы про что?
...
Рейтинг: 0 / 0
#pragma once НЕ РАБОТАЕТ?
    #34630340
Akh Чередник Олег Akh griegППКС Akh ...

Да, в стандарте про прагму сказано лишь:

16.6 2003
A preprocessing directive ... causes the implementation to behave in an implementation-defined manner. Any pragma that is not recognized by the implementation is ignored.


Т.е. прагма введена только как токин для не определенных стандартом поведений компилятора и не более того. Соотстветсвенно, по стандарту, а значит для общего случая, она не переносима.

Попробую заменить директиву #include на директиву #import
Это как в Java. У меня работало нормально и на Си.

А я попробую list на vector поменять... Вы про что?

А какая разница, если будет работать?? Если не будет - то :-(. А про List и Vector - не в тему!!!
...
Рейтинг: 0 / 0
#pragma once НЕ РАБОТАЕТ?
    #34630347
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чередник Олег wrote:

> А какая разница, если будет работать??
Помнится, #import и #include далеко не одно и то же делают.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
#pragma once НЕ РАБОТАЕТ?
    #34630354
ErV
Чередник Олег wrote:

> А какая разница, если будет работать??
Помнится, #import и #include далеко не одно и то же делают.
Posted via ActualForum NNTP Server 1.4

Наверно. Я не буду спорить, потому что честно могу сказать - НЕ ЗНАЮ.
Была такая заморока когда то (года 3 назад). Мне порекоммендовали везде проставить #import вместо #include. Всё заработало и всё - я забыл про енто.
Если такой умный - объясни чем отличаются #include и #import! Поясни, почему нельзя заменить одно на другое??
...
Рейтинг: 0 / 0
#pragma once НЕ РАБОТАЕТ?
    #34630411
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чередник Олег wrote:

> Если такой умный - объясни чем отличаются #include и #import! Поясни,
> почему нельзя заменить одно на другое??
Разговаривай по-нормальному. Могу бы сам поиском посмотреть.

#include вставляет в *.c (*.cpp, *.cxx, и т.д.) файл исходник (да и вообще
любой файл), указанный в кавычках либо скобках. Если исходник указан в
кавычках, то берется он из одного с файлом каталога. Если в скобках - то
происходит поиск по известным каталогам с *.h файлами - т.е. либо
прописанными в IDE либо в переменных среды (зависит от компилятора), либо
переданных в ключах компилятора. (-I/usr/X11R6/include :)). Это стандартная
директива, поддерживаемая любым компилятором.

#import - это другого плана директива, которая
используется, согласно "описалову" при импортировании в проект (причем
чисто виндовый) описаний COM интерфейсов, при этом (согласно ссылке) оно
автоматом создает *.h файлы. Подробности по ссылке. Т.е. оно не связано
вообще с исходниками, требует *.dll, *.odl или *.tlb. Судя по статье оно
ещё и ошибки время от времени генерит. Эту фишку мне приходилось
использовать довольно давно, когда я ковырял msxml3. Для подключения его к
проекту требовалась эта директива (кончилось все тем, что я решил поискать
что-то вроде libxml или tinyxml). По оставшимся вопросам читаем ссылку.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
#pragma once НЕ РАБОТАЕТ?
    #34630422
ErV
Чередник Олег wrote:

> Если такой умный - объясни чем отличаются #include и #import! Поясни,
> почему нельзя заменить одно на другое??
Разговаривай по-нормальному. Могу бы сам поиском посмотреть.

#include вставляет в *.c (*.cpp, *.cxx, и т.д.) файл исходник (да и вообще
любой файл), указанный в кавычках либо скобках. Если исходник указан в
кавычках, то берется он из одного с файлом каталога. Если в скобках - то
происходит поиск по известным каталогам с *.h файлами - т.е. либо
прописанными в IDE либо в переменных среды (зависит от компилятора), либо
переданных в ключах компилятора. (-I/usr/X11R6/include :)). Это стандартная
директива, поддерживаемая любым компилятором.

#import - это другого плана директива, которая
используется, согласно "описалову" при импортировании в проект (причем
чисто виндовый) описаний COM интерфейсов, при этом (согласно ссылке) оно
автоматом создает *.h файлы. Подробности по ссылке. Т.е. оно не связано
вообще с исходниками, требует *.dll, *.odl или *.tlb. Судя по статье оно
ещё и ошибки время от времени генерит. Эту фишку мне приходилось
использовать довольно давно, когда я ковырял msxml3. Для подключения его к
проекту требовалась эта директива (кончилось все тем, что я решил поискать
что-то вроде libxml или tinyxml). По оставшимся вопросам читаем ссылку.

Posted via ActualForum NNTP Server 1.4

:-) спасибо. Так подробно мог бы не расписывать чем отличается #include с кавычками и со скобками :-) Про #import знаю, что она Java используется и всё.. В Си его не применяю. Как уже говорил, просто вспомнил. Но всё равно, спасибо.
...
Рейтинг: 0 / 0
#pragma once НЕ РАБОТАЕТ?
    #34631866
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чередник Олег:-) спасибо. Так подробно мог бы не расписывать чем отличается #include с кавычками и со скобками :-) Про #import знаю, что она Java используется и всё.. В Си его не применяю. Как уже говорил, просто вспомнил. Но всё равно, спасибо.

бисер
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / #pragma once НЕ РАБОТАЕТ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]