|
|
|
#pragma once НЕ РАБОТАЕТ?
|
|||
|---|---|---|---|
|
#18+
Проект С++ 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 но результат тот же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2003, 11:31 |
|
||
|
#pragma once НЕ РАБОТАЕТ?
|
|||
|---|---|---|---|
|
#18+
Common.h должен быть написан так Код: plaintext 1. 2. 3. 4. 5. 6. А Код: plaintext 1. неверно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2003, 11:38 |
|
||
|
#pragma once НЕ РАБОТАЕТ?
|
|||
|---|---|---|---|
|
#18+
И так пробовал, результат тот же ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2003, 11:40 |
|
||
|
#pragma once НЕ РАБОТАЕТ?
|
|||
|---|---|---|---|
|
#18+
А что ты хочешь ? Ведь этот файл не скомпилился, компилятор не пометил его как "скомпилированный", и каждый раз пытается его скомпилировать. Пытаясь скомпилировать неоткопилированную компилятину, компилятор компилирует ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2003, 11:48 |
|
||
|
#pragma once НЕ РАБОТАЕТ?
|
|||
|---|---|---|---|
|
#18+
БЫТЬ такого не может - при правильно указании #ifndef ... #endif файл включается только если он уже не был включен Опишите что происходит - что пишет копилятор? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2003, 11:59 |
|
||
|
#pragma once НЕ РАБОТАЕТ?
|
|||
|---|---|---|---|
|
#18+
> А что ты хочешь ? Ведь этот файл не скомпилился, компилятор > не пометил его как "скомпилированный", и каждый раз пытается > его скомпилировать. Я так понимаю, что компиляция проходит так: берется .CPP файл проекта, препроцессор проходит по файлу, и если встречает #include "common.h", механически вставляет содержимое. .CPP файл компилируется, соответственно "выполняется" строчка #define __COMMON_H__. При пробежке по следующему файлу, прекомпилятор снова открывает common.h и видя строчку #ifndef __COMMON_H__ , содержимое файла игнорирует и соответствено к моменту компиляции второго .CPP файла он не содержит данных из common.h и нет повода выдавать те же ошибки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2003, 12:03 |
|
||
|
#pragma once НЕ РАБОТАЕТ?
|
|||
|---|---|---|---|
|
#18+
> Опишите что происходит - что пишет копилятор? Вот например, при включении в 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) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2003, 12:13 |
|
||
|
#pragma once НЕ РАБОТАЕТ?
|
|||
|---|---|---|---|
|
#18+
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; Всё перетранслировать и привет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2003, 17:30 |
|
||
|
#pragma once НЕ РАБОТАЕТ?
|
|||
|---|---|---|---|
|
#18+
Ой Вэй AlexeyEvt2 При пробежке по следующему файлу, прекомпилятор снова открывает common.h и видя строчку #ifndef __COMMON_H__ , содержимое файла игнорирует Нет, каждый файл транслируется отдельно. У следующего файла свой собственный набор Код: plaintext Код: plaintext Код: plaintext #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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2007, 17:11 |
|
||
|
#pragma once НЕ РАБОТАЕТ?
|
|||
|---|---|---|---|
|
#18+
Tubrik Зачем тогда вообще пишут эту конструкцию, если транслируется отдельно и она не спасает? #ifndef __COMMON_H__ #define __COMMON_H__ текст #endif чтобы в единицу компиляции 2 раза не попадали одни и теже объявления и описания. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2007, 17:16 |
|
||
|
#pragma once НЕ РАБОТАЕТ?
|
|||
|---|---|---|---|
|
#18+
значит #pragma once и конструкция с #define взаимозаменяемы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2007, 17:26 |
|
||
|
#pragma once НЕ РАБОТАЕТ?
|
|||
|---|---|---|---|
|
#18+
Tubrikзначит #pragma once и конструкция с #define взаимозаменяемы? Да, на компиляторах, которые поддерживают эту pragma-у с once. Я точно не знаю, как по стандарту компиляторы должны с ней работать, но, вроде, это дело самих компиляторов, возиться с прагмами, придумывать себе какие-нибудь. Поэтому define более переносимое решение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2007, 17:33 |
|
||
|
#pragma once НЕ РАБОТАЕТ?
|
|||
|---|---|---|---|
|
#18+
ППКС Akh Интерпретация #pragma как раз отводится на усмотрение компиляторов. Поэтому #pragma once более лаконично, но не переносимо С #define переносимо. С Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2007, 09:09 |
|
||
|
#pragma once НЕ РАБОТАЕТ?
|
|||
|---|---|---|---|
|
#18+
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. Т.е. прагма введена только как токин для не определенных стандартом поведений компилятора и не более того. Соотстветсвенно, по стандарту, а значит для общего случая, она не переносима. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2007, 10:01 |
|
||
|
#pragma once НЕ РАБОТАЕТ?
|
|||
|---|---|---|---|
|
#18+
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. У меня работало нормально и на Си. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2007, 14:59 |
|
||
|
#pragma once НЕ РАБОТАЕТ?
|
|||
|---|---|---|---|
|
#18+
Akh Tubrikзначит #pragma once и конструкция с #define взаимозаменяемы? Да, на компиляторах, которые поддерживают эту pragma-у с once. Есть нюанс :) pragma once защищает именно ФАЙЛ, конструкция с ifdef защищает КУСОК КОДА. Был у нас случай, когда один h-ник в двух разных папках по ошибке валялся ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2007, 15:13 |
|
||
|
#pragma once НЕ РАБОТАЕТ?
|
|||
|---|---|---|---|
|
#18+
Чередник ОлегПопробую заменить директиву #include на директиву #import Это как в Java. У меня работало нормально и на Си. Ээээ ... Вы вообще в курсе для чего используется #import ??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2007, 15:14 |
|
||
|
#pragma once НЕ РАБОТАЕТ?
|
|||
|---|---|---|---|
|
#18+
Чередник Олег 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 поменять... Вы про что? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2007, 15:43 |
|
||
|
#pragma once НЕ РАБОТАЕТ?
|
|||
|---|---|---|---|
|
#18+
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 - не в тему!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2007, 20:18 |
|
||
|
#pragma once НЕ РАБОТАЕТ?
|
|||
|---|---|---|---|
|
#18+
Чередник Олег wrote: > А какая разница, если будет работать?? Помнится, #import и #include далеко не одно и то же делают. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2007, 20:30 |
|
||
|
#pragma once НЕ РАБОТАЕТ?
|
|||
|---|---|---|---|
|
#18+
ErV Чередник Олег wrote: > А какая разница, если будет работать?? Помнится, #import и #include далеко не одно и то же делают. Posted via ActualForum NNTP Server 1.4 Наверно. Я не буду спорить, потому что честно могу сказать - НЕ ЗНАЮ. Была такая заморока когда то (года 3 назад). Мне порекоммендовали везде проставить #import вместо #include. Всё заработало и всё - я забыл про енто. Если такой умный - объясни чем отличаются #include и #import! Поясни, почему нельзя заменить одно на другое?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2007, 20:40 |
|
||
|
#pragma once НЕ РАБОТАЕТ?
|
|||
|---|---|---|---|
|
#18+
Чередник Олег 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2007, 22:18 |
|
||
|
#pragma once НЕ РАБОТАЕТ?
|
|||
|---|---|---|---|
|
#18+
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 используется и всё.. В Си его не применяю. Как уже говорил, просто вспомнил. Но всё равно, спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2007, 22:46 |
|
||
|
#pragma once НЕ РАБОТАЕТ?
|
|||
|---|---|---|---|
|
#18+
Чередник Олег:-) спасибо. Так подробно мог бы не расписывать чем отличается #include с кавычками и со скобками :-) Про #import знаю, что она Java используется и всё.. В Си его не применяю. Как уже говорил, просто вспомнил. Но всё равно, спасибо. бисер ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2007, 12:52 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=34629048&tid=2028583]: |
0ms |
get settings: |
7ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
184ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
66ms |
get tp. blocked users: |
1ms |
| others: | 233ms |
| total: | 530ms |

| 0 / 0 |
