如果您希望某些非成员函数只能由同一翻译单元中的函数调用,可以不在标题中定义它们吗?
答案 0 :(得分:4)
这很常见。保持杂乱的头文件。通常,您可以将它们放在.cpp文件中的匿名命名空间中。
您可以使用static关键字在没有匿名命名空间的情况下完成此操作。
答案 1 :(得分:1)
是的,非会员功能可以放在翻译单元内。
声明并将其定义为static
,以便它们在翻译单元中私有。
答案 2 :(得分:0)
可以在头文件中声明它们。但是如果你在标题中定义它们并且标题被多个编译单元包含在内,它将导致链接错误冲突。
见这个例子:
class Foo
{
};
void f()
{
}
# include "header.h"
# include "header.h"
int main()
{
}
[~]$ g++ -c a.cpp
[~]$ g++ -c b.cpp
[~]$ g++ -o run a.o b.o
b.o: In function `f()':
b.cpp:(.text+0x0): multiple definition of `f()'
a.o:a.cpp:(.text+0x0): first defined here
collect2: error: ld returned 1 exit status
[~]$
或者,如果您将声明和定义分开,如下所示:
class Foo
{
};
void f();
#include "header.h"
void f()
{
}
#include "header.h"
int main()
{
}
[~]$ g++ -c a.cpp
[~]$ g++ -c b.cpp
[~]$ g++ -o run a.o b.o
[~]$
答案 3 :(得分:0)
您可以将函数放在自己的命名空间中,这样它就不会干扰其余的代码。通常的做法是使命名空间成为主库命名空间的内部命名空间,并将其称为详细信息或类似内容。
当然,如果你需要通过ADL(参数依赖查找)来提供函数,那么它必须存在于包含ADL应该匹配的类的命名空间中。没有办法解决这个问题。