Para que é utilizado o "stdafx.h" no Visual Studio?

500

Um arquivo chamado stdafx.hé gerado automaticamente quando inicio um projeto no Visual Studio 2010. Preciso criar uma biblioteca C ++ de plataforma cruzada, para que eu não possa / não possa usar esse arquivo de cabeçalho.

Para que é stdafx.hutilizado? Posso remover este arquivo de cabeçalho?

prosseek
fonte
2
Se eu conseguir erro de compilação relacionado com stdafx.h, eu geralmente definir as configurações para não criam ou usam este ficheiro ..
phoad
6
Artigo: StdAfx.h para iniciantes
Você pode usar o arquivo de cabeçalho muito bem em outras plataformas, para elas é apenas um arquivo de cabeçalho normal. Apenas não oferece nenhum benefício de desempenho lá.
187 Andrea Andrea

Respostas:

826

Todos os compiladores C ++ têm um sério problema de desempenho para lidar. Compilar código C ++ é um processo longo e lento.

A compilação de cabeçalhos incluídos na parte superior dos arquivos C ++ é um processo muito longo e lento. Compilar as enormes estruturas de cabeçalho que fazem parte da API do Windows e outras grandes bibliotecas de API é um processo muito , muito longo e lento. Ter que repetir várias vezes para cada arquivo de origem Cpp é uma sentença de morte.

Isso não é exclusivo do Windows, mas um problema antigo enfrentado por todos os compiladores que precisam compilar com uma API grande como o Windows.

O compilador da Microsoft pode melhorar esse problema com um truque simples chamado cabeçalhos pré-compilados . O truque é bem simples: embora cada arquivo CPP possa dar um significado ligeiramente diferente à legalmente da cadeia de arquivos de cabeçalho incluídos na parte superior de cada arquivo Cpp (por coisas como ter macros diferentes # definidas antes das inclusões, ou incluindo os cabeçalhos em ordem diferente), que geralmente não é o caso. Na maioria das vezes, temos dezenas ou centenas de arquivos incluídos, mas todos eles têm o mesmo significado para todos os arquivos Cpp que estão sendo compilados em seu aplicativo.

O compilador pode economizar muito tempo se não precisar compilar todos os arquivos Cpp, além de dezenas de inclusões, literalmente, do zero.

O truque consiste em designar um arquivo de cabeçalho especial como ponto de partida de todas as cadeias de compilação, o chamado arquivo de 'cabeçalho pré-compilado', que geralmente é um arquivo chamado stdafx.h simplesmente por razões históricas.

Basta listar todos os seus grandes cabeçalhos enormes para suas APIs no seu arquivo stdafx.h, na ordem apropriada e, em seguida, iniciar cada um dos seus arquivos CPP no topo com um #include "stdafx.h", antes de qualquer conteúdo significativo (a única coisa permitida antes é comentários).

Nessas condições, em vez de começar do zero , o compilador começa a compilar a partir dos resultados já salvos da compilação de tudo stdafx.h.

Não acredito que esse truque seja exclusivo dos compiladores da Microsoft, nem acho que foi um desenvolvimento original.

Para compiladores Microsoft, a configuração que controla o uso de cabeçalhos pré-compilados é controlado por um argumento de linha de comando para o compilador: /Yu "stdafx.h". Como você pode imaginar, o uso do stdafx.hnome do arquivo é simplesmente uma convenção; você pode mudar o nome, se desejar.

No Visual Studio 2010, essa configuração é controlada na GUI, clicando com o botão direito do mouse em um projeto CPP, selecionando 'Properties' e navegando para "Configuration Properties \ C / C ++ \ Precompiled Headers". Para outras versões do Visual Studio, o local na GUI será diferente.

Observe que, se você desabilitar os cabeçalhos pré-compilados (ou executar o seu projeto através de uma ferramenta que não os suporte), isso não tornará o seu programa ilegal; significa simplesmente que sua ferramenta irá compilar tudo do zero todas as vezes.

Se você estiver criando uma biblioteca sem dependências do Windows, poderá comentar ou remover facilmente #includes do stdafx.harquivo. Não é necessário remover o arquivo em si, mas é claro que você também pode fazê-lo, desativando a configuração do cabeçalho de pré-compilação acima.

Euro Micelli
fonte
6
Mesmo se você usou apenas para arquivos de namespace std você recebe um benefício de velocidade
Ghita
11
omg, resposta muito boa mesmo.estava procurando um compilador c compatível com o padrão. Acontece que eu posso desativar as extensões micro $ oft das propriedades do projeto, alterar o compilador de "auto" para "c" e você está praticamente tendo o compilador "padrão" e o IDE.
EKanadily
4
@Rishi: por 'linha', você quer dizer #include "stdafx.h"? Claro, mas isso é apenas um #include padrão. A parte "extensão do MS" é apenas uma otimização de desempenho do compilador; isso não altera a semântica de ter um arquivo de cabeçalho que é chamado de "stdafx.h". Observe que se você remover a inclusão e seu código depender de qualquer coisa que foi incluída no stdafx.h, será necessário incluí-la diretamente.
Euro Micelli
4
@ Youda008, não é bem verdade. Antes de compilar um arquivo de código, o conteúdo dos cabeçalhos é simples e literalmente "colado" no local em que você #includeos encontra no arquivo de origem (feito pela mesma etapa do 'pré-processador' que avalia as macros). O arquivo total resultante é então passado para o compilador real, que nunca vê um arquivo de cabeçalho como uma entidade separada. Você só coloca declarações no arquivo de cabeçalho porque é isso que funciona bem em um arquivo de cabeçalho - é uma regra convencional. Tente! Crie um arquivo de cabeçalho com um programa inteiro e crie um arquivo de origem que tenha apenas #include. Compila bem.
Euro Micelli 12/12
28
Curiosidade histórica. O nome stdafx.h data de 1992, quando o MFC foi chamado de 'Application Framework Extensions' antes de seu lançamento. Visual Studio 2015 ainda o padrão é o nome ..
Kert
48

É um "arquivo de cabeçalho pré-compilado" - todos os cabeçalhos incluídos no stdafx.h são pré-processados ​​para economizar tempo durante as compilações subsequentes. Você pode ler mais sobre isso aqui no MSDN .

Se você estiver criando um aplicativo de plataforma cruzada, marque "Projeto vazio" ao criar seu projeto e o Visual Studio não colocará nenhum arquivo no seu projeto.

Casablanca
fonte
15
Não há nada neste arquivo que não funcione em outras plataformas. Pode atrasar a compilação, se o compilador não suportar cabeçalhos pré-compilados, mas não deve quebrá-lo. É apenas um arquivo de cabeçalho que inclui outros arquivos de cabeçalho.
detunized 18/01/01
2
@detunized: Talvez minha resposta tenha soado diferente, então obrigado por esclarecer essa parte.
casablanca
3

"Stdafx.h" é um cabeçalho pré-compilado. Inclui arquivos para arquivos padrão do sistema e arquivos específicos do projeto usados ​​com freqüência, mas que são alterados com pouca frequência. O que reduz o tempo de compilação e o processamento desnecessário.

O cabeçalho pré-compilado stdafx.h é basicamente usado no Microsoft Visual Studio para permitir que o compilador conheça os arquivos que foram compilados uma vez e não precise compilá-lo do zero. Você pode ler mais sobre isso

http://www.cplusplus.com/articles/1TUq5Di1/

https://docs.microsoft.com/pt-BR/cpp/ide/precompiled-header-files?view=vs-2017

Akash das
fonte
-10

Acabei de me deparar com isso, já que estou tentando criar uma estrutura básica, mas comecei criando uma nova opção de programa Win32 no Visual Studio 2017. "stdafx.h" é desnecessário e deve ser removido. Em seguida, você pode remover os "stdafx.h" e "stdafx.cpp" estúpidos que estão no Gerenciador de Soluções, bem como os arquivos do seu projeto. Em seu lugar, você precisará colocar

#include <Windows.h>

em vez de.

Adam H.
fonte