inserire le definizioni delle funzioni nei file di intestazione

 C Programming >> Programmazione C >  >> Tags >> File
inserire le definizioni delle funzioni nei file di intestazione

Il static e le versioni senza nome dello spazio dei nomi finiscono per essere le stesse:ogni unità di traduzione conterrà la propria versione della funzione, e ciò significa che data una funzione statica f , il puntatore &f sarà diverso in ciascuna unità di traduzione e il programma conterrà N diverse versioni di f (più codice nel binario).

Questo non l'approccio giusto per fornire un funzione in un'intestazione, fornirà N funzioni diverse (esattamente uguali). Se la funzione contiene static locali quindi ci saranno N diverso static variabili locali...

MODIFICA :Per renderlo più esplicito:se quello che vuoi è fornire la definizione di una funzione in un'intestazione senza infrangere la One Definition Rule, l'approccio giusto è rendere la funzione inline .


Per quanto ne so, solo inline e le funzioni del modello possono essere definite nei file di intestazione.

static le funzioni sono deprecate e dovrebbero essere utilizzate invece le funzioni definite in uno spazio dei nomi senza nome (vedere 7.3.1.1 p2). Quando si definisce una funzione in uno spazio dei nomi senza nome in un'intestazione, ogni codice sorgente incluso quell'intestazione (direttamente o indirettamente) avrà una definizione univoca (vedere 7.3.1.1 p1). Pertanto, le funzioni non devono essere definite nello spazio dei nomi senza nome nei file di intestazione (solo nei file di origine).

Lo standard a cui si fa riferimento proviene dallo standard c++03.

MODIFICA:

Il prossimo esempio mostra perché le funzioni e le variabili non dovrebbero essere definite in uno spazio dei nomi senza nome nelle intestazioni:

ops.hpp contiene:

#ifndef OPS_HPP
#define OPS_HPP
namespace
{
int a;
}
#endif

dk1.hpp contiene:

#ifndef DK1_HPP
#define DK1_HPP
void setValue();
void printValue();
#endif

dk1.cpp contiene:

#include "dk1.hpp"
#include "ops.hpp"
#include <iostream>

void setValue()
{
    a=5;
}
void printValue()
{
    std::cout<<a<<std::endl;
}

dk.cpp contiene:

#include "dk1.hpp"
#include "ops.hpp"
#include <iostream>

int main()
{
    // set and print a
    setValue();
    printValue();

    // set and print it again
    a = 22;
    std::cout<<a<<std::endl;

    // print it again
    printValue();
}

Compila in questo modo:

g++ -ansi -pedantic -Wall -Wextra dk.cpp dk1.cpp

e l'output:

5
22
5

ops la variabile a è diverso per il file sorgente dk1.cpp e dk.cpp