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

时间:2011-07-29 14:03:08

标签: c++ function global

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

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

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

6 个答案:

答案 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来支持未命名的命名空间。但是,使用未命名的命名空间和静态都会为每个转换单元创建单独的副本,这会增加二进制文件的大小。在这个意义上,内联的使用优于这两者。

这些解决方案允许编译器进行更多使用特定的优化,但与源文件中的定义相比,指令缓存更少,然后进行链接。