stdafx.h кроссплатформенный без проблем? - PullRequest
6 голосов
/ 10 марта 2011

Привет, я следил за новостями Learncpp.com последние пару дней, они говорят, что комментируют "#include" stdafx.h "из файлов .cpp для Code :: Blocks.

Это обязательно, чтобы удалить строку включения? Что произойдет, если у вас были сотни файлов и вы перешли с Visual Studio на Win7 на Code :: Blocks в Linux или передали кому-то еще с Mac?

Ответы [ 5 ]

10 голосов
/ 10 марта 2011

stdafx.h - это идиоматическое имя, используемое для предварительно скомпилированных заголовков в экосистеме Visual Studio. Короче говоря, это обычный заголовок, но содержимое этого файла будет скомпилировано один раз и повторно использовано для всех файлов cpp в проекте.

Это полезно, поскольку в большинстве проектов большое количество заголовков (стандартная библиотека, системный заголовок, общие определения для всего проекта) используются практически всеми модулями перевода (cpps), поэтому использование PCH является огромным выигрышем в производительности во время компиляции.

(На самом деле, PCH - это хак для обхода неэффективной модели компиляции и компоновки C ++, и это позор, что нам нужно поддерживать ее вручную… упс, богохульство.)

Но это также означает, что - пока содержимое вашего stdafx.h совместимо с gcc - компиляция с CodeBlocks должна все же работать, но без немедленного выигрыша в производительности.

stdafx.h, сгенерированный мастерами приложений VS, не работает "из коробки" на других платформах - обычно он включает Windows.h. Таким образом, чтобы это работало, защитите специфичные для Windows определения соответствующими парами #ifdef/#endif и наоборот для Linux или Mac.

4 голосов
/ 10 марта 2011

Нет, этот учебный совет не имеет никакого смысла.stdafx.h вообще ничего не ломает.Система предварительно скомпилированных заголовков в компиляторе Visual Studio специально разработана таким образом.

Если ваш компилятор поддерживает предварительно скомпилированные заголовки (и использует тот же подход предварительной компиляции, что и Visual Studio), он может использовать stdafx.h для предварительной компиляции.

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

Возможно, что под этим учебником подразумевается то, что stdafx.h часто включает в себя некоторые специфичные для Windows заголовки, которых нет на другой платформе.Хотя это и возможно, на самом деле это не имеет ничего общего с stdafx.h.Очевидно, что если вы компилируете свою программу на какой-то другой платформе, вы не должны пытаться включать какие-либо заголовки Windows, независимо от того, как вы это делаете: через stdafx.h или где-то еще.

1 голос
/ 10 марта 2011

Единственное, что нужно сделать, это включить путь, содержащий stdafx.h (или предварительно скомпилированный заголовок), в список путей по умолчанию.Это необходимо, потому что MS-компилятор фактически заменяет #include "stdafx.h" на предварительно скомпилированные данные, не ища заголовок.

Другие компиляторы обычно хотят получить данные.Но это не должно быть закомментировано.Обычно вы можете настроить свой компилятор так, чтобы он также использовал функции скомпилированных заголовков для ускорения компиляции.С gcc это будет сделано с опцией -pch.С помощью блоков кода я смог найти эту вики .Предварительно скомпилированные заголовки не являются злом, напротив, они сэкономят ваше драгоценное время, если их правильно понять и использовать.

1 голос
/ 10 марта 2011

Если вы на самом деле не используете предварительно скомпилированный заголовок (PCH), я советую перейти к Visual Studio's Options/Preferences->Precompiled Header и отключить их. Если вы попытаетесь удалить их и по-прежнему использовать Visual Studio, вы получите массу ошибок.

1 голос
/ 10 марта 2011

Насколько я знаю, stdafx.h - это файл только для Windows (для предварительно скомпилированных заголовков): ваш код просто не будет компилироваться, если вы не закомментируете его.

...