Estou trabalhando em um projeto que possui muito código C legado . Começamos a escrever em C ++, com a intenção de, eventualmente, converter também o código legado. Estou um pouco confuso sobre como o C e C ++ interagem. Entendo que envolver o código C com extern "C"
o compilador C ++ não alterará os nomes do código C , mas não tenho muita certeza de como implementá-lo.
Portanto, na parte superior de cada arquivo de cabeçalho C (após os protetores de inclusão), temos
#ifdef __cplusplus
extern "C" {
#endif
e na parte inferior, escrevemos
#ifdef __cplusplus
}
#endif
Entre os dois, temos todos os nossos incluem, typedefs e protótipos de função. Tenho algumas perguntas para verificar se estou entendendo isso corretamente:
Se eu tiver um arquivo C ++ A.hh que inclua um arquivo de cabeçalho C Bh, inclua outro arquivo de cabeçalho C Ch, como isso funciona? Eu acho que quando o compilador entrar em Bh,
__cplusplus
será definido, então ele envolverá o código comextern "C"
(e__cplusplus
não será definido dentro deste bloco). Portanto, quando entrar em Ch,__cplusplus
não será definido e o código não será envolvidoextern "C"
. Isso está correto?Há algo de errado em envolver um pedaço de código
extern "C" { extern "C" { .. } }
? O que o segundoextern "C"
fará?Não colocamos esse wrapper nos arquivos .c, apenas nos arquivos .h. Então, o que acontece se uma função não tiver um protótipo? O compilador acha que é uma função C ++?
Também estamos usando algum código de terceiros que está escrito em C e não possui esse tipo de wrapper. Sempre que incluo um cabeçalho dessa biblioteca, venho colocando uma questão em
extern "C"
torno da #include. É este o caminho certo para lidar com isso?Finalmente, isso é uma boa ideia? Há mais alguma coisa que devemos fazer? Vamos misturar C e C ++ no futuro próximo, e quero ter certeza de que estamos cobrindo todas as nossas bases.