0Pricing
C++ Academy · Aula

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
}
#endif

O 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

  1. extern C e a ABI de C
  2. Chamar Python a partir de C++ com pybind11
  3. C++ para fronteiras FFI de Rust
  4. Usar SWIG para ligações entre várias linguagens
← Voltar para C++ Academy