【问题标题】:Function in source file already defined in another source file error源文件中的函数已在另一个源文件中定义错误
【发布时间】:2020-07-17 03:56:51
【问题描述】:
// file1.h
#pragma once
void public1();
// file1.cpp
#include "file1.h"
void privateFunc() {}
void public1() {}
// file2.h
#pragma once
void public2();
// file2.cpp
#include "file2.h"
void privateFunc() {}
void public2() {}
// main.cpp
#include <iostream>
#include "file1.h"
#include "file2.h"
int main()
{
    std::cout << "Hello World!\n";
}

所以我在2个实现文件中有2个同名同参数的函数,但是实现方式不同。两者都不包含在它们的头文件中,所以我假设它们的编译器可以区分它们。我认为这是问题所在。

我怎样才能使函数privateFunc() 私有到实现文件而不将它放在一个类中?也就是说,当另一个文件包含“file1.h”或“file2.h”时,它应该不知道privateFunc()存在。

【问题讨论】:

    标签: c++ compiler-errors header linker


    【解决方案1】:

    要将函数设为私有,您必须将其声明为static。否则,该符号将可供链接器用于跨多个源解析。

    static void privateFunc() {}
    

    或者,您可以在未命名的命名空间中声明它:

    namespace
    {
        void privateFunc() {}
    }
    

    您可以阅读有关未命名命名空间的更多信息here

    【讨论】:

    • 啊我不知道静态的具体含义存在。这种情况下的“静态”表示“不包含到其他文件中”,对吗?
    • 表示函数有内部联动。这意味着另一个目标文件无法引用它。阅读:en.cppreference.com/w/cpp/language/storage_duration
    • @HuyĐứcLê 此问题仍在未回答问题列表中(因为您尚未接受此答案)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-24
    相关资源
    最近更新 更多