[英]How do you define a global function in C++?
我想要一个不是类成员的函数,可以从任何类访问。
我假设我必须#include
声明函数的头文件,但我不知道在哪里定义这样的全局函数。
是否有充分的理由反对首先拥有这样的功能?
你需要一个体(在一个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
你所谓的全局函数通常被称为自由函数 ,它们是一件好事 。
您可以将其定义为类的成员函数,但在该类的范围之外。
double squared(double x) {
return x*x;
}
您可以使用头文件中的inline
关键字定义的简单函数,或者只是在那里声明它
double squared(double x);
并将实现(第一个示例)放入*.cpp
文件中。
在头文件中:
// 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
以避免与您可能正在使用的其他库发生名称冲突。
除了@Necrolis的回答之外,不推荐使用static来支持未命名的命名空间 。 但是,使用未命名的命名空间和静态都会为每个转换单元创建单独的副本,这会增加二进制文件的大小。 在这个意义上,内联的使用优于这两者。
这些解决方案允许编译器进行更多使用特定的优化,但与源文件中的定义相比,指令缓存更少,然后进行链接。
想想main()。 这个功能只是......那里。 它不在任何类,结构或命名空间内。 你只需申报并给它一个身体。 当然,在函数不是main的情况下,最好将原型放在头文件中并将其定义在.cpp文件中。
请记住,C没有类,结构不能保存成员函数。 那时免费功能没有任何问题,现在还没有。
您必须在头文件中声明其原型并在实现文件中定义它。
//file.h
void foo();
//file.cpp
void foo ()
{}
为了简要回答您的第二个问题,当通用方式由几个不同的类和类型使用全局函数时,需要它们。 例如数学函数。
否则,通常您可以避免这么多全局函数。 此外,您应该避免使用static
本地成员或与此类功能相关联的全局数据(这样您就不必担心线程安全)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.