Une des exigences de l'ingénierie du logiciel est la production de
composants assemblables et utilisables dans plusieurs réalisations,
comme dans toute autre activité industrielle. La mise en uvre de
cette exigence dans un langage de programmation est permise par la
notion de module. Plusieurs langages, notamment Modula 2 et Ada,
ont été conçus autour de cette notion. L'idée est qu'un programme est
formé à partir de plusieurs modules ; les objets définis dans chaque
module sont classifiés, soit publics, soit privés ; les
objets publics d'un module sont déclarés dans son interface et
sont exportables vers les autres modules, lesquels déclarent dans
leurs interfaces les objets qu'ils importent.
C ne dispose pas d'une notion de module, mais permet de réaliser la distinction public/privé de façon très simple et rudimentaire. C++ dispose également de mécanismes de modularité qui sont basés sur la notion de classe. Le langage disposant actuellement de la meilleure notion de module semble être Standard ML.
Rappelons qu'un nom local n'est connu qu'à l'intérieur de la fonction où il est défini. Par contre, un nom global est connu dans un fichier à partir du point où une déclaration de ce nom est faite : un nom global est donc a priori public. Pour le rendre privé, c'est-à-dire pour limiter l'accès à un objet global au fichier où il est défini, on fait précéder sa définition par le mot-clé static :
static int t[10]; static double f(double t[]) { ... }
Un programme C comporte donc une suite de définitions d'objets ; celles qui sont désignées static sont privées, les autres sont publiques (donc exportables). Ce mécanisme impose une contrainte d'organisation : toutes les fonctions utilisant un même objet global privé (fonction, variable ou tableau) doivent figurer dans le même fichier.