В невеликих за розміром програмах функцію main і всі інші функції доцільно записувати в одному текстовому файлі. Якщо програма велика і складна, то доцільно поділити її на декілька програмних файлів, код кожного з яких можна створювати і компілювати автономно.
У багато файлових програмах питання видимості постають у межах одного файлу та на меж файловому рівні. Встановлено такі правила:
1) об’єкти, оголошені на зовнішньому рівні (тобто між функціями), є частково глобальними, область їх дії – від точки оголошення до кінця програмного файлу;
2) щоб звернутись до глобальної змінної, описаної в іншому файлі, необхідно в поточному файлі оголосити цю змінну з специфікатором extern;
3) функції є глобальними об’єктами, тобто вони описуються тільки один раз, областю їх дії є вся програма;
4) прототипи функцій є частково видимими, вони діють в межах одного програмного файлу.
Згідно з третім правилом кожна функція повинна бути описана тільки один раз в програмі у якомусь з файлів. Для звертання до функції з інших файлів або перед її описом у тому ж файлі треба попередньо вказати прототип функції. Областю дії прототипу функції є один програмний файл, тому в кожному файлі програми треба окремо оголошувати прототипи всіх необхідних функцій.
Зазвичай створюють заголовний файл, в якому записують декларації шаблонів структурних типів і прототипи функцій і файл з розширенням срр, в якому функції описані повністю. Наприклад:
#include <iostream>
#include "fibonachi.h"
using namespace std;
int main( ) {
cout << fib( 46 );
}
// fibonachi.h
#ifndef FIBONACHI
#define FIBONACHI
long fib( long n );
#endif
// fibonachi.cpp
#include "fibonachi.h"
static long knownf[ 47 ];
void init_fibo( void ) {
knownf[ 0 ]=0;
knownf[ 1 ]=1;
for( int i = 2; i < 47; i++ )
knownf[ i ] = -1;
}
long fib( long n ) {
static int num;
if ( ++num == 1 ) init_fibo( );
if ( knownf[ n ] != -1 )
return knownf[ n ];
else {
knownf[ n ] = fib( n - 1 ) + fib( n - 2 );
return knownf[ n ];
}
}