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.