好的,不在标题中包含一些非成员函数?

时间:2015-10-07 15:30:35

标签: c++

如果您希望某些非成员函数只能由同一翻译单元中的函数调用,可以不在标题中定义它们吗?

4 个答案:

答案 0 :(得分:4)

这很常见。保持杂乱的头文件。通常,您可以将它们放在.cpp文件中的匿名命名空间中。

您可以使用static关键字在没有匿名命名空间的情况下完成此操作。

答案 1 :(得分:1)

是的,非会员功能可以放在翻译单元内。

声明并将其定义为static,以便它们在翻译单元中私有

答案 2 :(得分:0)

可以在头文件中声明它们。但是如果你在标题中定义它们并且标题被多个编译单元包含在内,它将导致链接错误冲突。

见这个例子:

header.h

class Foo
{
};

void f()
{
}

b.cpp

# include "header.h"

a.cpp

# 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
[~]$

或者,如果您将声明和定义分开,如下所示:

header.h

class Foo
{
};

void f();

b.cpp

#include "header.h"

void f()
{
}

a.cpp

#include "header.h"

int main()
{
}

那就没事了

[~]$ g++ -c a.cpp
[~]$ g++ -c b.cpp
[~]$ g++ -o run a.o b.o
[~]$

此外,静态适用于上面的帖子。

答案 3 :(得分:0)

您可以将函数放在自己的命名空间中,这样它就不会干扰其余的代码。通常的做法是使命名空间成为主库命名空间的内部命名空间,并将其称为详细信息或类似内容。

当然,如果你需要通过ADL(参数依赖查找)来提供函数,那么它必须存在于包含ADL应该匹配的类的命名空间中。没有办法解决这个问题。