Насколько я знаю, только inline
и шаблонные функции могут быть определены в заголовочных файлах.
static
функции устарели, и вместо них следует использовать функции, определенные в безымянном пространстве имен (см. 7.3.1.1 п2).Когда вы определяете функцию в безымянном пространстве имен в заголовке, тогда каждый исходный код, включая этот заголовок (прямо или косвенно), будет иметь уникальное определение (см. 7.3.1.1 p1).Следовательно, функции не должны определяться в безымянном пространстве имен в заголовочных файлах (только в исходных файлах).
Указанный стандарт взят из стандарта c ++ 03.
РЕДАКТИРОВАНИЕ:
Следующий пример демонстрирует, почему функции и переменные не должны определяться в безымянном пространстве имен в заголовках:
ops.hpp содержит:
#ifndef OPS_HPP
#define OPS_HPP
namespace
{
int a;
}
#endif
dk1.hpp содержит:
#ifndef DK1_HPP
#define DK1_HPP
void setValue();
void printValue();
#endif
dk1.cpp содержит:
#include "dk1.hpp"
#include "ops.hpp"
#include <iostream>
void setValue()
{
a=5;
}
void printValue()
{
std::cout<<a<<std::endl;
}
dk.cpp содержит:
#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();
}
Компилировать так:
g++ -ansi -pedantic -Wall -Wextra dk.cpp dk1.cpp
и вывод:
5
22
5
ops переменной a
отличается для исходного файла dk1.cpp
и dk.cpp