Hasta donde yo sé, solo inline
y las funciones de plantilla se pueden definir en archivos de encabezado.
static
funciones están en desuso, y las funciones definidas en un espacio de nombre sin nombre se deben utilizar en su lugar (ver 7.3.1.1 p2). Cuando define una función en un espacio de nombre sin nombre en un encabezado, entonces cada código fuente que incluye ese encabezado (directa o indirectamente) tendrá una definición única (vea 7.3.1.1 p1). Por lo tanto, las funciones no se deben definir en el espacio de nombre sin nombre en los archivos de encabezado (solo en los archivos fuente).
Los estándares a los que se hace referencia son del estándar C++ 03.
EDIT:
siguiente ejemplo demuestra por qué las funciones y variables no deben ser definidos en espacio de nombres sin nombre en los encabezados:
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();
}
Compilar como esto:
g++ -ansi -pedantic -Wall -Wextra dk.cpp dk1.cpp
y la salida:
5
22
5
ops la variable a
es diferente para el archivo de origen dk1.cpp
y dk.cpp
Olvidó: conviértalas en plantillas de funciones. Eso es lo que generalmente prefiero. – sbi
no use estática que genere muchas copias y locura. –
La solución de "una copia en cada espacio de nombre anónimo" lleva a la misma locura. – MSalters