Насколько я знаю, только inline
и функции шаблона могут быть определены в заголовочных файлах.
static
функции устарели, и вместо них следует использовать функции, определенные в неназванном пространстве имен (см. 7.3.1.1 p2). Когда вы определяете функцию в неназванном пространстве имен в заголовке, каждый исходный код, включающий этот заголовок (прямо или косвенно), будет иметь уникальное определение (см. 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;
}
дк.каст содержит:
#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();
}
Compile так:
g++ -ansi -pedantic -Wall -Wextra dk.cpp dk1.cpp
и выход:
5
22
5
опс переменная a
отличается для исходного файла dk1.cpp
и dk.cpp
Вы забыли: превратите их в функциональные шаблоны. Это то, что я обычно предпочитаю. – sbi
не используют статические элементы, которые приводят ко многим разным копиям и безумию. –
Решение «одна копия в каждом анонимном пространстве имен» приводит к тому же безумию. – MSalters