在 C++ 的单独文件中使用名称空间的正确方法是什么?
What is the right way to have namespaces in seperate files in C++?
在其他文件中使用命名空间的正确方法是什么,以便我可以将它们与 #include<>
一起使用
test.h
#ifndef TEST_H_INCLUDED
#define TEST_H_INCLUDED
namespace numbers{
const int foo = 8;
}
#endif //TEST_H_INCLUDED
不过我也看到了这个
test.h
#ifndef TEST_H_INCLUDED
#define TEST_H_INCLUDED
namespace numbers{
extern const int foo;
}
#endif //TEST_H_INCLUDED
test.cpp
#include "test.h"
namespace numbers{
const int foo = 8;
}
然后是我想用它的地方,
#include "test.h"
std::cout << numbers::foo;
两者都有效,哪个才是正确的方法,为什么?
使用第一种方法,您将获得多个定义(假设您有多个包含),这是允许的,因为全局常量不受单一定义规则的约束。
第二种方法只有一个定义,在test.cpp.
第一种方法更有可能导致编译器优化,因为编译器总是知道常量的值,但如果对象的构造成本很高,则使用第二种方法可能更好,因为没有风险必须构造多个对象。尽管即使在那种情况下,链接器也可能会删除除一个对象之外的所有对象。
在其他文件中使用命名空间的正确方法是什么,以便我可以将它们与 #include<>
test.h
#ifndef TEST_H_INCLUDED
#define TEST_H_INCLUDED
namespace numbers{
const int foo = 8;
}
#endif //TEST_H_INCLUDED
不过我也看到了这个
test.h
#ifndef TEST_H_INCLUDED
#define TEST_H_INCLUDED
namespace numbers{
extern const int foo;
}
#endif //TEST_H_INCLUDED
test.cpp
#include "test.h"
namespace numbers{
const int foo = 8;
}
然后是我想用它的地方,
#include "test.h"
std::cout << numbers::foo;
两者都有效,哪个才是正确的方法,为什么?
使用第一种方法,您将获得多个定义(假设您有多个包含),这是允许的,因为全局常量不受单一定义规则的约束。
第二种方法只有一个定义,在test.cpp.
第一种方法更有可能导致编译器优化,因为编译器总是知道常量的值,但如果对象的构造成本很高,则使用第二种方法可能更好,因为没有风险必须构造多个对象。尽管即使在那种情况下,链接器也可能会删除除一个对象之外的所有对象。