【问题标题】:Is it legal / good to put function prototype of a function defined in a different source (not header) file?将函数的函数原型放在不同的源文件(不是头文件)中是否合法/好?
【发布时间】:2015-03-05 18:18:50
【问题描述】:

我不确定我的描述是否恰当地描述了该问题。当我尝试了解外部链接和内部链接时,我发现了这一点。假设我有一个包含 2 个文件的项目:

//A.cpp
#include <iostream>
void doSomething();
int main()
{
    doSomething();
    return 0;
}

//B.cpp
#include <iostream>
void doSomething()
{
    std::cout << "Doing it" << std::endl;
    std::cin.get();
}

请注意,这两个文件都不是标题。他们只提供 2 个翻译单元。

我惊讶地发现它可以编译并正常工作。当我在不同的文件中具有相同的效用函数(如线性插值)时,我习惯于编写这样的代码以避免多定义错误:

//A.cpp
#include <iostream>
static void doSomething()
{
    std::cout << "Doing it" << std::endl;
    std::cin.get();
}
int main()
{
    doSomething();
    return 0;
}


//B.cpp
#include <iostream>
static void doSomething()
{
    std::cout << "Doing it" << std::endl;
    std::cin.get();
}
/* some other functions that call doSomething() */

这显然是多余的,上面的方法似乎可以解决它。 但我想知道这真的是一种公认​​的风格吗?如果没有 IDE 的帮助,甚至找不到函数的定义。

【问题讨论】:

    标签: c++ static extern linkage function-prototypes


    【解决方案1】:

    第一段代码是合法的,但不是好的做法。最好创建一个.h 文件,将函数原型和#include 文件放在所有使用该函数的.cc 文件中。

    //B.h
    #ifndef B_H
    #define B_H
    void doSomething();
    #endif
    
    //A.cpp
    #include <iostream>
    #include "B.h"
    int main()
    {
        doSomething();
        return 0;
    }
    
    //B.cpp
    #include <iostream>
    #include "B.h"
    
    void doSomething()
    {
        std::cout << "Doing it" << std::endl;
        std::cin.get();
    }
    

    【讨论】:

    • 啊,是的。将函数原型放在那里实际上相当于包含一个仅包含该原型的标头。没有意识到。谢谢!
    • 不仅等价,而且实际上相同。预处理器将其内联,以便在编译时无论您是否保存到单独的文件,它看起来都完全相同。
    【解决方案2】:

    static关键字意味着这个函数、对象或变量只在那个翻译单元中可用,通常是一个cpp文件。您可以在多个 cpp 文件中拥有多个 static doSomething 函数。

    关于联动。为了使用功能,提供原型就足够了。这通常在 h 文件中完成,但您也可以手动提供非静态函数的函数原型。 h 文件只是用于定义函数外观的原型,以便 c 文件使用它们。正如我所说,您也可以通过其他方式提供原型。由链接器将这些函数链接在一起。

    【讨论】:

    • @NeilKirk static void doSomething()
    • @Zéychin 他知道 static 关键字的含义。他想知道为什么没有静态的代码可以工作。
    猜你喜欢
    • 1970-01-01
    • 2019-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    相关资源
    最近更新 更多