Макрос компилятора C ++ для статуса «Использовать предварительно скомпилированные заголовки» - PullRequest
2 голосов
/ 07 ноября 2011

Это предопределенный макрос компилятора c ++, который я могу использовать, чтобы указать, компилируется ли файл с помощью «Использовать предварительно скомпилированные заголовки», «Создать предварительно скомпилированные заголовки», «Не использовать предварительно скомпилированные заголовки»?

См. @Ответ IronMensan с целью такого макроса!

Ответы [ 5 ]

2 голосов
/ 07 ноября 2011

Я не думаю, что есть что-то, хотя я, конечно, понимаю желание одного.Всякий раз, когда мне приходится создавать свою кроссплатформенную библиотеку в системе, которая не поддерживает PCH, это занимает вечность, поскольку многие файлы тянут больше, чем им действительно нужно, и было бы неплохо обрезать это.К сожалению, я не могу из-за того, как Visual Studio обрабатывает PCH.А именно, что включение PCH должно быть первой строкой без комментариев в файле.Судя по тому, как вы сформулировали свой вопрос, я подозреваю, что вы также работаете с Visual Studio.

Я не уверен, будет ли это работать для вас, но вы можете попробовать что-то вроде этого:

#include MY_PCH_FILE

И используйте /DMY_PCH_FILE="myfile.h"

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

Хотя я должен признать, что не уверенчто вы пытаетесь сделать, и я подозреваю, что это действительно XY проблема

1 голос
/ 24 апреля 2014

Visual Studio / MSC не предоставляет предопределенный макрос, который содержит параметр переключателя компилятора /Y[-cdu] для проверки из исходного кода.

Однако существует решение проблемы, которую вы пытаетесь решитьт. е. контроль того, должна ли первая строка без комментариев исходного файла быть #include "<my pch.h>": MSC предлагает переключатель компилятора имени *1006*.

Этот параметр имеет тот же эффект, что и указание файла с двойными кавычками в директиве #include в первой строке каждого исходного файла, указанного в командной строке [...]

Этот переключатель компилятораможет быть задано либо в командной строке компилятора, либо для каждого проекта через графический интерфейс IDE (Проект -> Свойства: C / C ++ -> Дополнительно: Принудительное включение файла).

С помощью комбинацииПереключатели компилятора /Y[-cdu] и /FI позволяют контролировать использование и выполнять требования для использования предварительно скомпилированных заголовков из-за пределов исходного кода.

0 голосов
/ 01 ноября 2016

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

#if USE_PRECOMPILEDHDR
    #ifndef FORCED_INCLUDEHDR
        #include "stdafx.h"
    #endif
#else 
    //..manualy include all your headers
#endif

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

0 голосов
/ 07 ноября 2011

Если вы хотите включить заголовочные файлы в зависимости от того, включены ли предварительно скомпилированные заголовки, вам следует вместо этого использовать Включить защиту .

0 голосов
/ 07 ноября 2011

Эта функция вряд ли существует.Весь смысл предварительно скомпилированных заголовков состоит в том, что заголовки будут компилироваться с точно такими же параметрами компилятора, как и при компиляции по-настоящему.Если бы компилятор предложил способ для вашего кода заметить разницу, то вы могли бы заставить свой код вести себя по-разному (на уровне препроцессора) в зависимости от того, компилятор прекомпилирует или фактически компилирует.

...