O que faz extern "C" em C++ e por que é necessário ao trabalhar com bibliotecas C?
Olá! Comecei a estudar C++ e me deparei com a construção `extern "C"`, que vejo frequentemente em arquivos de cabeçalho. Por exemplo, em bibliotecas como SDL ou ao conectar funções C antigas.
Aqui está um exemplo que encontrei em um artigo:
```cpp
// my_header.h
#ifdef __cplusplus
extern "C" {
#endif
void my_c_function(int x);
int another_c_function(const char* str);
#ifdef __cplusplus
}
#endif
```
Entendo que isso tem a ver com linkagem e nomes de funções, mas não consigo entender os detalhes. Especificamente, estou interessado em:
1. Por que sem `extern "C"` podem ocorrer erros de linkagem ao usar funções C em C++?
2. O que é "name mangling" e como ele está relacionado a esse problema?
3. Por que envolver as declarações em `#ifdef __cplusplus`? Afinal, se estou escrevendo em C++, `__cplusplus` está sempre definido, certo?
4. Posso usar `extern "C"` para minhas próprias funções C++ se quiser que elas sejam acessíveis a partir de código C?
Agradeço uma explicação com exemplos simples. Tentei pesquisar, mas...