我想要一个不是类成员的函数,可以从任何类访问。
我假设我必须#include
声明函数的头文件,但我不知道在哪里定义这样的全局函数。
是否有充分的理由反对首先拥有这样的功能?
答案 0 :(得分:26)
你需要一个正文(在cpp
文件中):
int foo()
{
return 1;
}
和头文件中的定义/原型,在使用函数之前将包含它:
#ifndef MY_FOO_HEADER_
#define MY_FOO_HEADER_
int foo();
#endif
然后在其他地方使用它:
#include foo.h
void do_some_work()
{
int bar = foo();
}
或使用内联函数(不保证它内联,但对小函数有用,如foo
):
#ifndef MY_FOO_HEADER_
#define MY_FOO_HEADER_
inline int foo()
{
return 1;
}
#endif
或者你可以滥用基于C风格的头部函数(因此这在标题中,static
强制它仅存在于单个编译单元中,你应该避免这种情况):
#ifndef MY_FOO_HEADER_
#define MY_FOO_HEADER_
static int foo()
{
return 1;
}
#endif
答案 1 :(得分:6)
您所谓的全局功能通常称为自由功能,它们是A Good Thing。
您可以将其定义为类的成员函数,但不在该类的范围内。
double squared(double x) {
return x*x;
}
您可以使用头文件中的inline
关键字定义的简单函数,或者只是在那里声明
double squared(double x);
并将实现(第一个示例)放入*.cpp
文件中。
答案 2 :(得分:3)
在头文件中:
// someheader.h
#ifndef MY_GLOBAL_FUN
#define MY_GLOBAL_FUN
void my_global_fun();
#endif
在实施文件中:
#include "someheader.h"
void my_global_fun()
{
// ...
}
在需要该功能的其他文件中:
#include "someheader.h"
void f()
{
my_global_fun();
}
这样的自由函数很有用,反对使用它们的参数不多。根据您的使用情况,可能适合将这些函数放在特定的namespace
中,以避免与您可能正在使用的其他库发生名称冲突。
答案 3 :(得分:0)
想想main()。这个功能只是......那里。它不在任何类,结构或命名空间内。你只需申报并给它一个身体。当然,在函数不是main的情况下,最好将原型放在头文件中并将其定义在.cpp文件中。
请记住,C没有类,结构不能保存成员函数。那时免费功能没有任何问题,现在还没有。
答案 4 :(得分:0)
您必须在头文件中声明其原型并在实现文件中定义它。
//file.h
void foo();
//file.cpp
void foo ()
{}
为了简要回答您的第二个问题,当通用方式由几个不同的类和类型使用全局函数时,需要全局函数。例如数学函数。
否则,通常您可以避免这么多全局函数。此外,您应该避免使用static
本地成员或与此类功能相关联的全局数据(这样您就不必担心线程安全)。
答案 5 :(得分:0)
除了@Necrolis的回答之外,不推荐使用static来支持未命名的命名空间。但是,使用未命名的命名空间和静态都会为每个转换单元创建单独的副本,这会增加二进制文件的大小。在这个意义上,内联的使用优于这两者。
这些解决方案允许编译器进行更多使用特定的优化,但与源文件中的定义相比,指令缓存更少,然后进行链接。