如何在C++中定义全局函数?

Cor*_*ein 22 c++ global function

我想要一个不是类成员的函数,可以从任何类访问.

我假设我必须#include在声明函数的头文件中,但我不知道在哪里定义这样的全局函数.

是否有充分的理由反对首先拥有这样的功能?

Nec*_*lis 27

你需要一个体(在cpp文件中):

int foo()
{
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

以及头文件中的定义/原型,在使用该函数之前将包含它:

#ifndef MY_FOO_HEADER_
#define MY_FOO_HEADER_
    int foo();
#endif
Run Code Online (Sandbox Code Playgroud)

然后在其他地方使用它:

#include foo.h
void do_some_work()
{
    int bar = foo();
}
Run Code Online (Sandbox Code Playgroud)

或者使用内联函数(不保证它会被内联,但对于小功能非常有用,比如foo):

#ifndef MY_FOO_HEADER_
#define MY_FOO_HEADER_
    inline int foo()
    {
        return 1;
    }
#endif
Run Code Online (Sandbox Code Playgroud)

或者你可以滥用基于C风格的头部函数(所以这在一个标题中,static强制它只存在于一个编译单元中,你应该避免这种情况):

#ifndef MY_FOO_HEADER_
#define MY_FOO_HEADER_
    static int foo()
    {
        return 1;
    }
#endif
Run Code Online (Sandbox Code Playgroud)

  • 为什么要避免使用`static`来强制函数仅存在于单个编译单元中? (2认同)

Ben*_*ier 6

你所谓的全局函数通常被称为自由函数,它们是一件好事.

您可以将其定义为类的成员函数,但在该类的范围之外.

double squared(double x) {
    return x*x;
}
Run Code Online (Sandbox Code Playgroud)

您可以使用inline头文件中的关键字定义的简单函数,或者只是在那里声明它

double squared(double x);
Run Code Online (Sandbox Code Playgroud)

并将实现(第一个示例)放入*.cpp文件中.


Cha*_*had 5

在头文件中:

// someheader.h
#ifndef MY_GLOBAL_FUN
#define MY_GLOBAL_FUN

void my_global_fun();    

#endif
Run Code Online (Sandbox Code Playgroud)

在实现文件中:

#include "someheader.h"

void my_global_fun()
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

在需要该功能的其他文件中:

#include "someheader.h"

void f()
{
    my_global_fun();
}
Run Code Online (Sandbox Code Playgroud)

像这样的自由函数很有用,并且没有太多反对使用它们的理由。根据您的用例,将这些函数放在特定的位置可能是合适的namespace,以避免与您可能使用的其他库发生名称冲突。