现在,我正在用c ++编写一个复杂的项目。我简化了这个示例,在命名空间中,我定义了两个函数,这两个函数都需要彼此。
namespace Example {
void foo()
{
bar();
}
void bar()
{
foo();
}
}
有没有办法在不将函数与命名空间分开的情况下解决我的问题?
您可以在命名空间内进行转发声明,方式与在全局命名空间范围内完全相同:
namespace Example {
void bar();
void foo()
{
bar();
}
void bar()
{
foo();
}
}
但是,对于任何函数,如果这些函数是在多个翻译单元之间共享的头文件中定义的函数,则需要将它们标记为inline
。如果它们是在一个翻译单元中仅以一个.cpp
含义声明和定义的函数,那么它们可能应该标记为static
,以便可以在其他翻译单元中声明其他具有相同名称的函数,而不会发生名称冲突以及随之而来的 ODR 违规和 UB。
此外,您可以根据需要随时打开和关闭命名空间,并根据需要打开和关闭任意数量的文件和翻译单元。 例如
namespace Example {
void foo();
void bar();
}
在头文件中和
#include<header.h>
namespace Example {
void foo()
{
bar();
}
void bar()
{
foo();
}
}
在相应的.cpp
也可以。