2009-08-25 2 views
4

Есть ли способ, чтобы препроцессор обнаружил, что код в текущем единицах перевода использует (или создает) предварительно скомпилированные заголовки?

---
Фактическая проблема, с которой я сейчас сталкиваюсь, заключается в том, что я нахожусь в проекте, который является , злоупотребляющим PCH, предварительно скомпилировав практически все файлы заголовков.
Это означает, что нет ни одного из понятного управления зависимостями, которое вы можете получить из #includes и время компиляции ужасно. Практически каждое изменение вызовет полную перестройку.
Приложение способ для больших, чтобы просто исправить его за один раз, а некоторые из старых парней отказываются от , чтобы поверить, что прекомпиляция ничего не является плохим. Сначала мне нужно это доказать.
Так что я должен сделать это шаг за шагом и убедиться, что мои изменения не влияют на код , который скомпилирован старым способом PCH.
Мой план состоит в том, чтобы сделать ifdef из PCH.h и работать с версией без PCH, когда у меня есть время, чтобы сэкономить.Обнаружение предварительно скомпилированных заголовков

#ifdef USES_PCH 
#include "PCH.h" 
#elif 
// include only whats needed 
#endif 

Я хотел бы избежать определения USES_PCH в командной строке и вручную сохранить его в синхронизации с/Y, что, кроме того, если не будет очень элегантный, будет боль. Существует множество конфигураций и модулей для манипулирования файлами и большого количества файлов, которые не соответствуют значениям по умолчанию для проекта.

+0

Конечно препроцессор уже знает, является ли это предполагается генерировать или использовать скомпилированные заголовки. Это не нужно * обнаруживать * что угодно. Вы вместо этого хотели спросить, может ли обработанный * код * обнаружить его, например, с помощью некоторой команды 'ifdef'? –

+0

Да, я хочу сделать #ifdef __USES_PCH или что-то подобное – grimner

+0

Какова проблема, которую вы хотите решить? – peterchen

ответ

1

Насколько я знаю, она не может, но есть некоторые эвристики: VC++ использует stdafx.h, Borland использует #pragma hdrstop и т.д.

+0

VC++ использует StdAfx.h, если вы работаете с настройками проекта по умолчанию, вы можете изменить это в любое время. –

+0

Я для одного меняю его на что-то уникальное для каждого vcproj, но я ожидаю, что многие проекты просто идут со значениями по умолчанию. – rpg

3

Если Visual C++ определены константы, чтобы указать, является ли скомпилированных заголовков были использованы, вероятно, он будет указан в Predefined Macros. И там это не документировано, поэтому, вероятно, этого не существует. (Если он существует, он, вероятно, недокументирован и может измениться в будущей версии.)

+0

Да, я знаю, что нет официального макроса. Если бы он был один, мне бы не пришлось спрашивать здесь. Я надеялся, что кто-то знает какой-то косвенный способ понять это в любом случае. – grimner

3

Это не сработает при использовании предварительно скомпилированных заголовков в Visual C++, вы даже не можете иметь какой-либо код перед включением предварительно скомпилированного заголовка. Я пытался сделать что-то подобное, когда наткнулся на ваш вопрос. После небольшого проб и ошибок я обнаружил, что перед директивой #include для предварительно скомпилированного заголовка при использовании опции компилятора/Юг не может быть кода.

#ifdef USES_PCH 
#include "stdafx.h" 
#endif 

Результат: фатальный C1020 ошибки: неожиданный #endif

+0

Я уже собирался попробовать это хорошо, а потом :) thx – n00b

+0

Я думаю, что #ifdef перед прекомпилированным заголовком работает в VS2015. – ShitalShah

+0

@ShitalShah, это не работает для меня в VS2015. Вышеприведенный код по-прежнему вызывает ошибку C1020, когда файл настроен на использование параметра PCH (/ Yu). – Matthew

Смежные вопросы