Общие файлы в проектах с Precompiled Header и без
От: ch.  
Дата: 14.09.09 11:47
Оценка:
Коллеги, добрый день.

Есть два файла file.h и file.cpp, которые включены в два разных проекта. В первом проекте используется Precompiled Header (PH), во втором — нет. Соответственно в проекте с PH во всех файлах включая file.cpp должен присутствовать #include stdafx.h, а в проектах где PH не исползуется — файла stdafx.h нет вообще.

Вопрос: как подружить файлы file.h и file.cpp с обеими проектами?


Пробовал объявлять в stdafx.h #define _STDAFX_H, и в file.cpp писать так:

#ifdef _STDAFX_H
#include stdafx.h
#endif

Но при компиляции в первом проекте с PH возникает ошибка "fatal error C1020: unexpected #endif". Я так понимаю, что это связано именно с тем, что файл stdafx.h не просто заголовочный файл, а precompiled header.

Есть варианты решения проблемы?

Заранее спасибо.
Re: Общие файлы в проектах с Precompiled Header и без
От: BogusCoder Швеция  
Дата: 14.09.09 11:57
Оценка:
Здравствуйте, ch., Вы писали:

ch.>Коллеги, добрый день.


ch.>Есть два файла file.h и file.cpp, которые включены в два разных проекта. В первом проекте используется Precompiled Header (PH), во втором — нет. Соответственно в проекте с PH во всех файлах включая file.cpp должен присутствовать #include stdafx.h, а в проектах где PH не исползуется — файла stdafx.h нет вообще.


ch.>Вопрос: как подружить файлы file.h и file.cpp с обеими проектами?



ch.>Пробовал объявлять в stdafx.h #define _STDAFX_H, и в file.cpp писать так:


ch.>#ifdef _STDAFX_H

ch.>#include stdafx.h
ch.>#endif

ch.>Но при компиляции в первом проекте с PH возникает ошибка "fatal error C1020: unexpected #endif". Я так понимаю, что это связано именно с тем, что файл stdafx.h не просто заголовочный файл, а precompiled header.


ch.>Есть варианты решения проблемы?


ch.>Заранее спасибо.


включение cpp файлов тоже не запретный плод, создайте дополнительный пустой срр в проекте с precompiled headers, и включите после stdafx.h ващ сорс
Re: Общие файлы в проектах с Precompiled Header и без
От: Nik_1 Россия  
Дата: 14.09.09 11:59
Оценка:
В данном случаи похоже, что file.ххх это некоторая "общая библиотечная функциональность", используемая несколькими проектами. Вынеси их в статическую либу и подключай ее в обоих проектах.
Re: Общие файлы в проектах с Precompiled Header и без
От: icWasya  
Дата: 14.09.09 12:09
Оценка:
Здравствуйте, ch., Вы писали:

ch.>Коллеги, добрый день.


ch.>...


ch.>Пробовал объявлять в stdafx.h #define _STDAFX_H, и в file.cpp писать так:


ch.>#ifdef _STDAFX_H

ch.>#include stdafx.h
ch.>#endif

ch.>...


ch.>Заранее спасибо.

А точно #ifdef _STDAFX_H ?
Может быть надо #ifndef _STDAFX_H ?
Re: Общие файлы в проектах с Precompiled Header и без
От: Pasternak  
Дата: 14.09.09 12:17
Оценка: +2
Здравствуйте, ch., Вы писали:

ch.>Коллеги, добрый день.


ch.>Есть два файла file.h и file.cpp, которые включены в два разных проекта. В первом проекте используется Precompiled Header (PH), во втором — нет. Соответственно в проекте с PH во всех файлах включая file.cpp должен присутствовать #include stdafx.h, а в проектах где PH не исползуется — файла stdafx.h нет вообще.


ch.>Вопрос: как подружить файлы file.h и file.cpp с обеими проектами?


[...]

ch.>Есть варианты решения проблемы?


1) Вынести file.h и file.cpp в отдельную библиотеку
2) В проект без PH добавить пустой stdafx.h (как обычный файл не PH)
3) Если используется Visual Studio то в проекте с PH для файла file.cpp отключить использование PH (из контекстного меню Properties\C/C++\Precompiled Headers\Create/Use Precompiled Header = "Not Using precompiled header").
Re: Общие файлы в проектах с Precompiled Header и без
От: kankan Украина  
Дата: 14.09.09 12:31
Оценка: :)
Здравствуйте, ch., Вы писали:

ch.>#include stdafx.h


Именно так и написал? Может надо

#include "stdafx.h"
Re[2]: Общие файлы в проектах с Precompiled Header и без
От: ch.  
Дата: 14.09.09 12:40
Оценка:
Здравствуйте, Pasternak, Вы писали:

P>Здравствуйте, ch., Вы писали:


ch.>>Коллеги, добрый день.


ch.>>Есть два файла file.h и file.cpp, которые включены в два разных проекта. В первом проекте используется Precompiled Header (PH), во втором — нет. Соответственно в проекте с PH во всех файлах включая file.cpp должен присутствовать #include stdafx.h, а в проектах где PH не исползуется — файла stdafx.h нет вообще.


ch.>>Вопрос: как подружить файлы file.h и file.cpp с обеими проектами?


P>[...]


ch.>>Есть варианты решения проблемы?


P>1) Вынести file.h и file.cpp в отдельную библиотеку

P>2) В проект без PH добавить пустой stdafx.h (как обычный файл не PH)
P>3) Если используется Visual Studio то в проекте с PH для файла file.cpp отключить использование PH (из контекстного меню Properties\C/C++\Precompiled Headers\Create/Use Precompiled Header = "Not Using precompiled header").

О! 3-й пункт именно то, что надо! Спасибо огромное.
Re: Общие файлы в проектах с Precompiled Header и без
От: MasterZiv СССР  
Дата: 14.09.09 16:25
Оценка:
ch. пишет:

> Есть два файла file.h и file.cpp, которые включены в два разных проекта.

> В первом проекте используется Precompiled Header (PH), во втором — нет.
> Соответственно в проекте с PH во всех файлах включая file.cpp должен
> присутствовать #include stdafx.h, а в проектах где PH не исползуется —
> файла stdafx.h нет вообще.
>
> Вопрос: как подружить файлы file.h и file.cpp с обеими проектами?

Итак, надо подружить файлы file.h и file.cpp.

file.h -- в нём 100% никода не должно быть #include stdafx.h. Т.е. он
уже подружен.

file.cpp -- проблема в том, что в одном проекте там по идеологии должно быть

#include stdafx.h, а в другом проекте его быть не должно.

Решение очень просто -- либо ты делаешь, чтобы в двух проектах оно
должно быть, либо наоборот. Как делать, чтобы оно должно быть,
ты наверное знаешь. А как делать в проекте, где используется PCH,
исходный файл, который не использует PCH -- а вот так (на уровне тыканья мышой в
GUI IDE):
надо открыть конфигурацию проекта, встать НА ЭТОТ КОНКРЕТНЫЙ ФАЙЛ .cpp (или как
его) и в секции Precompiled Headers выбрать пункт Not using precompiled headers.

При этом ВСЕ ОСТАЛЬНЫЕ исходники проекта будут использовать PCH, а этот данный
исходник не будет. Влиять на семантику компиляции это не должно, только на
её скорость. Да, и, естественно, все заголовки, присутствующие в stdafx.h,
и нужные именно для этого исходника, должны быть включены в него, без stdafx.h.
Это тоже не страшно, это кстати должно быть взято за правило для оформления
любого кода.

Ну и на последок стоит сказать, что в любом проекте PCH применять не
обязательно, влиять это будет только на скорость сборки. Ничего, ежели что, --
подождём.

> > #ifdef _STDAFX_H

> #include stdafx.h
> #endif

это было очень глупо. Ты больше так не делай.
Posted via RSDN NNTP Server 2.1 beta
Re[2]: Общие файлы в проектах с Precompiled Header и без
От: MasterZiv СССР  
Дата: 14.09.09 16:29
Оценка: +1
MasterZiv пишет:

>> > #ifdef _STDAFX_H

>> #include stdafx.h
>> #endif

Да, я забыл сказать, в чём самый прикол.
Прикол в том, что AFX — это старое название библиотеки MFC
(Application Framework Extention(или -ded)),
и stdafx.h раньше использовался только в проектах, использующих MFC.
Теперь же, в новых VC, MFC, не MFC, -- им похоже всё равно, но
общий заголовок называется stdafx.h, даже ежели моё приложение
к MFC не имеет никакого отношения.
Posted via RSDN NNTP Server 2.1 beta
Re[2]: Общие файлы в проектах с Precompiled Header и без
От: Вертер  
Дата: 14.09.09 23:31
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>надо открыть конфигурацию проекта, встать НА ЭТОТ КОНКРЕТНЫЙ ФАЙЛ .cpp (или как

MZ>его) и в секции Precompiled Headers выбрать пункт Not using precompiled headers.

а можно ещё проще, но мало кто знает
можно совсем не включать stdafx.h в cpp файлы, а открыть свойство проекта, пойти в раздел "Configuration Properties" -> "C/C++" -> "Advanced" и в поле "Force Includes" прописать stdafx.h

This option has the same effect as specifying the file with double quotation marks in an #include directive on the first line of every source file specified on the command line, in the CL environment variable, or in a command file. If you use multiple /FI options, files are included in the order they are processed by CL.


Как минимум Visual Studio 2008 это поддерживает.
Re[3]: Общие файлы в проектах с Precompiled Header и без
От: Вертер  
Дата: 14.09.09 23:35
Оценка:
В>а можно ещё проще, но мало кто знает
В>можно совсем не включать stdafx.h в cpp файлы, а открыть свойство проекта, пойти в раздел "Configuration Properties" -> "C/C++" -> "Advanced" и в поле "Force Includes" прописать stdafx.h
В>

В>This option has the same effect as specifying the file with double quotation marks in an #include directive on the first line of every source file specified on the command line, in the CL environment variable, or in a command file. If you use multiple /FI options, files are included in the order they are processed by CL.


данный механизм очень хорошо помогает с автоматически генерируемыми файлами Qt moc, когда всё-таки хочется использовать "Precompiled Header" для всего проекта.
Re: Общие файлы в проектах с Precompiled Header и без
От: vzankin  
Дата: 16.09.09 07:18
Оценка:
Здравствуйте, ch., Вы писали:

ch.>Есть два файла file.h и file.cpp, которые включены в два разных проекта. В первом проекте используется Precompiled Header (PH), во втором — нет. Соответственно в проекте с PH во всех файлах включая file.cpp должен присутствовать #include stdafx.h, а в проектах где PH не исползуется — файла stdafx.h нет вообще.


Что-то никто не посоветовал самый простой вариант: в file.cpp не включать stdafx.h вообще, и в проекте использующем PH отключить это самое использование только для file.cpp.
В студии это делается просто: правой кнопкой по нужному файлу -> свойства -> Not Using Precompiled Header
Re[2]: Общие файлы в проектах с Precompiled Header и без
От: ch.  
Дата: 16.09.09 07:23
Оценка:
Здравствуйте, vzankin, Вы писали:

V>Здравствуйте, ch., Вы писали:


ch.>>Есть два файла file.h и file.cpp, которые включены в два разных проекта. В первом проекте используется Precompiled Header (PH), во втором — нет. Соответственно в проекте с PH во всех файлах включая file.cpp должен присутствовать #include stdafx.h, а в проектах где PH не исползуется — файла stdafx.h нет вообще.


V>Что-то никто не посоветовал самый простой вариант: в file.cpp не включать stdafx.h вообще, и в проекте использующем PH отключить это самое использование только для file.cpp.

V>В студии это делается просто: правой кнопкой по нужному файлу -> свойства -> Not Using Precompiled Header

Уже трижды посоветовали.
Спасибо всем.
Re: Общие файлы в проектах с Precompiled Header и без
От: AlexCrush Россия  
Дата: 16.09.09 07:57
Оценка: 1 (1)
Здравствуйте, ch., Вы писали:

ch.>Но при компиляции в первом проекте с PH возникает ошибка "fatal error C1020: unexpected #endif". Я так понимаю, что это связано именно с тем, что файл stdafx.h не просто заголовочный файл, а precompiled header.


Что делать уже не раз посоветовали, хочу лишь обратить внимание на то почему же так происходит.
Дело в том, что при включенных PCH студия полностью игнорирует содержимое файла до строчки с #include "stdafx.h", таким образом её абсолютно пофиг, есть там #ifdef или нет, вот и получается unexpected endif. Хоть стихи пишите до #include "stdafx.h".
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.