Após migrar do ambiente VC6.0 para o Visual Studio, encontrei algumas particularidades ao desenvolver aplicações C++ no VS2010. Este registro visa documentar os pontos essenciais para facilitar futuros desenvolvimentos.
Ao iniciar um novo projeto de console Win32 em C++, o VS2010 automaticamente gera uma esrtutura com arquivos como stdafx.h, targetver.h, stdafx.cpp e o arquivo principal do projeto, por exemplo, MeuProjetoWin32.cpp.
O arquivo stdafx.h já inclui a biblioteca stdio.h, permitindo o uso direto de funções como printf na função principal _tmain.
A biblioteca tchar.h define diversas macros, incluindo a conversão de _tmain para wmain, dependendo da configuração do projeto.
Inclusão de Arquivos de Cabeçalho
- A inclusão de arquivos de cabeçalho pode ser feita com colchetes angulares < > ou aspas " >. O pré-processador busca primeiro nos caminhos do sistema quando usamos < >, enquanto as fazem uma busca inicial no diretório do projeto antes de procurar nos caminhos do sistema.
Recomenda-se utilizar < > para APIs do sistema e " > para arquivos locais, pois isso habilita recursos de auto-completar do Visual Studio.
- A inclusão de alguns arquivos sem a extensão .h não funciona em versões rceentes do Visual Studio. Por exemplo, incluir resulta em erro, enquanto funciona corretamente.
Isso ocorre porque:
1. É necessário distinguir entre as bibliotecas padrão do C e do C++. O iostream pertence ao C++, enquanto stdio.h é do padrão C.<br></br><br></br>2. O novo padrão C++ eliminou os arquivos de cabeçalho com extensão .h, portanto nas versões do VS2005 em diante, não existe mais o iostream.h.<br></br><br></br>3. Nas versões mais antigas do VS, como o VC6.0, utilizava-se a biblioteca C++ antiga, com arquivos como iostream.h, sem o conceito de namespaces. Já no VS2005, adotou-se o novo padrão C++, exigindo o uso de #include <iostream> sem a extensão .h.<br></br><br></br>4. Os namespaces podem conter diversas entidades como funções, identificadores e tipos de dados. O novo padrão C++ colocou todos os nomes das bibliotecas padrão dentro do namespace std. Portanto, após incluir #include <iostream>, é necessário usar using namespace std; para acessar as classes e funções da biblioteca.<br></br><br></br>5. Para as bibliotecas padrão do C, como stdio.h, não há o conceito de namespace, então podem ser usadas diretamente após a inclusão.<br></br><br></br>6. Para unificar o tratamento das bibliotecas C no C++, o novo padrão removeu a extensão .h e adicionou o prefixo 'c', transformando stdio.h em cstdio. Ao usar #include <cstdio>, o conteúdo é idêntico ao de stdio.h, mas exige o uso do namespace std.<br></br><br></br>7. Assim, para as bibliotecas C++ modernas, sem a extensão .h, é obrigatório usar o namespace std após a inclusão. Para as bibliotecas C, há duas opções: usar a forma antiga com .h (como stdio.h) ou a forma unificada do C++ (como cstdio) com o namespace.<br></br><br></br>Recomenda-se adotar a forma unificada, especialmente ao misturar bibliotecas C e C++:
<br></br>#include <cstdio>
<br></br>#include <iostream>
<br></br>using namespace std;
Utilizendo a API do Windows
#include "stdafx.h"
#include <Windows.h>
#include <iostream>
#include <string>
using namespace std;
int principal(int argc, char* argv[])
{
// Estrutura para informações do sistema
SYS_INFO dadosSistema;
GetSystemInfo(&dadosSistema);
// Exibindo o tamanho da página de memória
cout << "Tamanho da pagina de memoria: " << dadosSistema.tamanhoPagina << " bytes" << endl;
// Pausa para visualização do resultado
system("pause");
return 0;
}
A função system("pause");<br></br><br></br>invoca o comando "pause" do sistema operacional, que exibe uma mensagem como "Pressione qualquer tecla para continuar" e aguarda a entrada do usuário antes de encerrar o programa.