O ile wiem, tylko inline
i funkcje szablonu można zdefiniować w plikach nagłówkowych.
static
funkcje są nieaktualne, a zamiast nich należy zastosować funkcje zdefiniowane w nienazwanej przestrzeni nazw (patrz 7.3.1.1 p2). Po zdefiniowaniu funkcji w nienazwanej przestrzeni nazw w nagłówku, każdy kod źródłowy zawierający ten nagłówek (bezpośrednio lub pośrednio) będzie miał unikalną definicję (patrz 7.3.1.1 p1). Dlatego funkcje nie powinny być zdefiniowane w nienazwanej przestrzeni nazw w plikach nagłówkowych (tylko w plikach źródłowych).
Podane standardy pochodzą ze standardu C++ 03.
EDIT:
Następny przykład pokazuje, dlaczego funkcje i zmienne nie powinny być zdefiniowane w przestrzeni nazw bezimiennego w nagłówkach:
ops.hpp zawiera:
#ifndef OPS_HPP
#define OPS_HPP
namespace
{
int a;
}
#endif
DK1 .hpp zawiera:
#ifndef DK1_HPP
#define DK1_HPP
void setValue();
void printValue();
#endif
dk1.cpp zawiera:
#include "dk1.hpp"
#include "ops.hpp"
#include <iostream>
void setValue()
{
a=5;
}
void printValue()
{
std::cout<<a<<std::endl;
}
dk.CPP zawiera:
#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();
}
kompilacji tak:
g++ -ansi -pedantic -Wall -Wextra dk.cpp dk1.cpp
i wyjście:
5
22
5
ops zmienna a
jest różna dla pliku źródłowego dk1.cpp
i dk.cpp
Zapomniałeś: zamień je w szablony funkcji. To zazwyczaj wolę. – sbi
nie używaj statycznego, który prowadzi do wielu różnych kopii i szaleństwa. –
Rozwiązanie "Jedna kopia w każdym anonimowym obszarze" prowadzi do tego samego szaleństwa. – MSalters