En C, si vous définissez une fonction dans un fichier d'en-tête, cette fonction apparaîtra dans chaque module compilé qui inclut ce fichier d'en-tête et un symbole public sera exporté pour la fonction. Donc, si la fonction additup est définie dans header.h, et foo.c et bar.c incluent tous les deux header.h, alors foo.o et bar.o incluront tous les deux des copies d'additup.
Lorsque vous allez lier ces deux fichiers objets ensemble, l'éditeur de liens verra que le symbole additup est défini plusieurs fois et ne le permettra pas.
Si vous déclarez que la fonction est statique, aucun symbole ne sera exporté. Les fichiers objets foo.o et bar.o contiendront tous les deux des copies distinctes du code de la fonction, et ils pourront les utiliser, mais l'éditeur de liens ne pourra voir aucune copie de la fonction, donc il ne se plaindra pas. Bien entendu, aucun autre module ne pourra non plus voir la fonction. Et votre programme sera gonflé de deux copies identiques de la même fonction.
Si vous déclarez uniquement la fonction dans le fichier d'en-tête, mais ne la définissez pas, puis la définissez dans un seul module, l'éditeur de liens verra une copie de la fonction, et chaque module de votre programme pourra la voir et utilise le. Et votre programme compilé ne contiendra qu'une seule copie de la fonction.
Ainsi, vous pouvez avoir la définition de la fonction dans le fichier d'en-tête en C, c'est juste un mauvais style, une mauvaise forme et une mauvaise idée générale.
(Par «déclarer», je veux dire fournir un prototype de fonction sans corps; par «définir», je veux dire fournir le code réel du corps de fonction; c'est la terminologie C standard.)