Theo như tôi biết, chỉ có inline
và chức năng mẫu có thể được xác định trong tệp tiêu đề. Các hàm
static
không được dùng nữa và các hàm được xác định trong không gian tên chưa đặt tên sẽ được sử dụng thay thế (xem 7.3.1.1 p2). Khi bạn định nghĩa một hàm trong một không gian tên chưa đặt tên trong một tiêu đề, thì mọi mã nguồn bao gồm tiêu đề đó (trực tiếp hoặc gián tiếp) sẽ có một định nghĩa duy nhất (xem 7.3.1.1 p1). Do đó, các hàm không nên được định nghĩa trong không gian tên chưa đặt tên trong các tệp tiêu đề (chỉ trong các tệp nguồn).
Tiêu chuẩn được tham chiếu đến từ tiêu chuẩn C++ 03.
EDIT:
dụ Tiếp theo cho thấy lý do tại sao chức năng và các biến không cần được xác định vào không gian tên vô danh trong tiêu đề:
ops.hpp chứa:
#ifndef OPS_HPP
#define OPS_HPP
namespace
{
int a;
}
#endif
DK1 .hpp chứa:
#ifndef DK1_HPP
#define DK1_HPP
void setValue();
void printValue();
#endif
dk1.cpp chứa:
#include "dk1.hpp"
#include "ops.hpp"
#include <iostream>
void setValue()
{
a=5;
}
void printValue()
{
std::cout<<a<<std::endl;
}
dk.cpp chứa:
#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 như thế này:
g++ -ansi -pedantic -Wall -Wextra dk.cpp dk1.cpp
và đầu ra:
5
22
5
ops biến a
là khác nhau cho các nguồn tập tin dk1.cpp
và dk.cpp
Nguồn
2011-10-20 10:17:24
Bạn quên: Biến chúng thành các mẫu chức năng. Đó là những gì tôi thường thích. – sbi
không sử dụng tĩnh dẫn đến nhiều bản sao khác nhau và sự điên rồ. –
Giải pháp "một bản sao trong mỗi không gian tên vô danh" dẫn đến cùng một sự điên rồ. – MSalters