extern C e a ABI de C
Exponha interfaces compatíveis com C a partir de bibliotecas C++ usando extern C
extern C e a ABI de C é uma aula grátis de C++ Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C++ Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C++ Academy inclui 4 aulas no total.
Por que interoperar?
O C++ tem uma ABI complexa (Interface Binária de Aplicação), com modificação de nomes, exceções e modelos. Outras linguagens (C, Python, Rust) não podem usar diretamente símbolos C++ com nomes modificados.
extern "C"
Envolva as declarações em extern "C" para desativar a modificação de nomes do C++ e usar a convenção de chamada do C.
extern "C" {
void greet(const char* name);
int add(int a, int b);
}Por que a ABI C?
A ABI C é o mínimo denominador comum entre as linguagens. Quase toda linguagem pode chamar funções C por meio da FFI.
Padrão de arquivo de cabeçalho
Torne um cabeçalho utilizável tanto em C quanto em C++ com um extern "C" condicional.
#ifdef __cplusplus
extern "C" {
#endif
void hello(void);
int sum(int a, int b);
#ifdef __cplusplus
}
#endifO que você não pode exportar
Alguns recursos do C++ não têm equivalente em C:
- Classes (não existe o conceito de classe em C)
- Modelos (resolvidos em tempo de compilação, não podem ser exportados)
- Funções sobrecarregadas (sem modificação de nomes, não há sobrecarga)
- Exceções (devem ser capturadas antes de atravessar a FFI)
Expondo uma classe
Oculte a classe por trás de ponteiros opacos e de uma API no estilo C.
// header (C visible)
typedef struct Widget Widget;
Widget* widget_create(int x);
void widget_destroy(Widget*);
int widget_value(const Widget*);
// .cpp
class WidgetImpl { /* ... */ };
extern "C" {
Widget* widget_create(int x) { return reinterpret_cast<Widget*>(new WidgetImpl(x)); }
void widget_destroy(Widget* w) { delete reinterpret_cast<WidgetImpl*>(w); }
}Evite exceções através da FFI
Exceções lançadas por uma função C++ chamada via C causarão uma interrupção. Capture-as na fronteira.
extern "C" int safe_call() {
try {
risky();
return 0;
} catch (...) {
return -1;
}
}Propriedade da memória
Documente quem é responsável por cada recurso — geralmente, quem aloca é quem libera. Incompatibilidades causam vazamentos ou liberações duplas.
Cadeias de caracteres através da FFI
std::string é exclusivo do C++. Atravesse a FFI usando const char*. Decida se o receptor fará uma cópia e documente o tempo de vida.
Estruturas através da FFI
Use estruturas POD (dados simples antigos) que tenham o mesmo layout em C e C++. Evite funções virtuais, referências ou tipos da biblioteca padrão.
Funções de retorno
Passe ponteiros de função (ou void* + ponteiro de função) através da FFI. Forneça um ponteiro de contexto para fechamentos.
extern "C" {
typedef void (*Callback)(int value, void* user_data);
void register_callback(Callback cb, void* user_data);
}Ligação e cabeçalhos
O extern "C" afeta apenas a ligação, não o comportamento. A função ainda é compilada como C++ internamente, mas pode ser chamada como C externamente.
Verificação rápida
Por que envolver funções C++ em extern "C" ao expô-las a outras linguagens?
Recapitulação
extern "C" fornece ligação C a uma função — sem modificação de nomes e com a convenção de chamada do C. Use-o para expor C++ a outras linguagens por meio da FFI. Oculte classes atrás de ponteiros opacos, capture exceções na fronteira e documente claramente a propriedade dos recursos.
Perguntas Frequentes
A aula “extern C e a ABI de C” é grátis?
Sim — o texto completo de “extern C e a ABI de C” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C++ Academy, atualize para CoddyKit PRO. O curso de C++ Academy inclui 4 aulas no total.
O que vou aprender em “extern C e a ABI de C”?
Exponha interfaces compatíveis com C a partir de bibliotecas C++ usando extern C Você pratica C++ Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar C++ Academy?
Nenhuma experiência prévia é necessária. C++ Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.
Quanto tempo leva a aula “extern C e a ABI de C”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de C++ Academy?
Sim. Cada aula de C++ Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- extern C e a ABI de C
- Chamar Python a partir de C++ com pybind11
- C++ para fronteiras FFI de Rust
- Usar SWIG para ligações entre várias linguagens