静态非成员函数和非静态非成员函数有什么区别? [重复]

问题描述 投票:0回答:1

这两个非成员函数有什么区别?

static void
function1() {
    std::cout << "Test" << std::endl;
}

void
function2() {
    std::cout << "Test" << std::endl;
}

编辑:我知道静态意味着该函数具有内部链接,并且默认情况下全局范围内的函数具有外部链接,但我真的不知道它会有什么不同。如果我们将函数声明为静态或不声明,我们仍然必须包含包含该函数的文件才能在另一个文件中使用它。这并不取决于函数是否是静态的,对吗?

根据 cppreference.com :

内部链接:可以在当前翻译单元的所有范围内引用该名称。

外部链接:可以从其他翻译单元的范围中引用该名称。

c++ static static-functions
1个回答
-1
投票

当您将非成员函数(或与此相关的任何数据类型)定义为静态时,您实质上是在说该符号是在此文件中定义的,并且不会在其他文件中引用。这是链接中的一个重要想法,例如,如果我有两个相同的函数(假设它们像我的示例中那样被强定义,即具有函数体),并且我不将它们标记为静态,则会导致链接器错误。但如果我将它们声明为静态,那么链接器就知道它们是文件的本地文件,并将其视为正常。

文件1

void doSomething(){} // LINKER ERROR

文件2

void doSomething(){} // LINKER ERROR

文件1

static void doSomething(){} // OK

文件2

static void doSomething(){} // OK

static 关键字可以与 extern 一起使用来操纵链接器处理函数的“可见性”。如果您计划在其他文件中使用非成员函数,则不应将其标记为静态。

© www.soinside.com 2019 - 2024. All rights reserved.