Muitos anos depois, descubro essa pergunta. Depois de ler todas as respostas e comentários, pensei em esclarecer alguns detalhes ... Isso pode ser útil para as pessoas que chegam aqui através da pesquisa no Google.
A questão é especificamente sobre o uso de funções "externas", portanto ignorarei o uso de "externas" com variáveis globais.
Vamos definir 3 protótipos de função:
//--------------------------------------
//Filename: "my_project.H"
extern int function_1(void);
static int function_2(void);
int function_3(void);
O arquivo de cabeçalho pode ser usado pelo código fonte principal da seguinte maneira:
//--------------------------------------
//Filename: "my_project.C"
#include "my_project.H"
void main(void){
int v1 = function_1();
int v2 = function_2();
int v3 = function_3();
}
int function_2(void) return 1234;
Para compilar e vincular, devemos definir "function_2" no mesmo arquivo de código-fonte em que chamamos essa função. As duas outras funções podem ser definidas em código-fonte diferente " .C" ou podem estar localizadas em qualquer arquivo binário ( .OBJ, * .LIB, * .DLL), para o qual talvez não tenhamos o código-fonte.
Vamos incluir novamente o cabeçalho "my_project.H" em um arquivo "* .C" diferente para entender melhor a diferença. No mesmo projeto, adicionamos o seguinte arquivo:
//--------------------------------------
//Filename: "my_big_project_splitted.C"
#include "my_project.H"
void old_main_test(void){
int v1 = function_1();
int v2 = function_2();
int v3 = function_3();
}
int function_2(void) return 5678;
int function_1(void) return 12;
int function_3(void) return 34;
Recursos importantes a serem observados:
Quando uma função é definida como "estática" em um arquivo de cabeçalho, o compilador / vinculador deve encontrar uma instância de uma função com esse nome em cada módulo que usa esse arquivo de inclusão.
Uma função que faz parte da biblioteca C pode ser substituída em apenas um módulo, redefinindo um protótipo com "estático" apenas nesse módulo. Por exemplo, substitua qualquer chamada para "malloc" e "free" para adicionar o recurso de detecção de vazamento de memória.
O especificador "extern" não é realmente necessário para funções. Quando "estático" não é encontrado, sempre se assume que uma função é "externa".
No entanto, "extern" não é o padrão para variáveis. Normalmente, qualquer arquivo de cabeçalho que define variáveis a serem visíveis em muitos módulos precisa usar "extern". A única exceção seria se um arquivo de cabeçalho fosse garantido para ser incluído em um e apenas um módulo.
Muitos gerentes de projeto exigiriam que essa variável fosse colocada no início do módulo, não dentro de nenhum arquivo de cabeçalho. Alguns projetos grandes, como o emulador de videogame "Mame", exigem que essa variável apareça apenas acima da primeira função que os utiliza.