gpt4 book ai didi

c++ - 多个函数定义错误

转载 作者:IT老高 更新时间:2023-10-28 14:00:38 25 4
gpt4 key购买 nike

几年前参加了入门类(class)后,我正在尝试重新学习 C++,但我遇到了一些基本问题。我当前的问题是在尝试使用 friend 功能时出现的。这是我在 2 个文件中的代码。

第一:

// fun.cpp

#include <iostream>
using namespace std;

class classA {
friend void funct();
public:
classA(int a=1,int b=2):propa(a),propb(b){cout<<"constructor\n";}
private:
int propa;
int propb;
void outfun(){
cout<<"propa="<<propa<<endl<<"propb="<<propb<<endl;
}
};
void funct(){ // ERROR HERE
cout<<"enter funct"<<endl;
classA tmp(1,2);
tmp.outfun();
cout<<"exit funct"<<endl;
}

第二:

// mainfile.cpp
#include <iostream>
#include "fun.cpp"
using namespace std;

int main(int nargin,char* varargin[]) {
cout<<"call funct"<<endl;
funct();
cout<<"exit main"<<endl;
return 0;
}

我得到的错误是“`funct()' 的多重定义”。将其声明为友元函数时是否使用了错误的语法?

最佳答案

这是一个高度简化但希望相关的 View ,说明使用 C++ 构建代码时会发生什么。

C++ 将生成机器可执行代码的负载分为以下不同阶段 -

  1. 预处理 - 这是任何宏的地方 - #define s 等你可能正在使用得到扩展。

  2. 编译 - 每个 cpp 文件连同所有 #include该文件中的 d 文件直接或间接(统称为编译单元)被转换为机器可读的目标代码。

    这也是 C++ 检查所有已定义函数的地方(即在 { } 中包含一个主体,例如 void Foo( int x){ return Boo(x); })以有效的方式引用其他功能。

    这样做的方式是坚持在调用它之前至少提供这些其他函数的声明(例如 void Boo(int); ),以便它可以检查您是否正确调用它。这可以直接在调用它的 cpp 文件中完成,也可以通常在包含的头文件中完成。

    请注意,只有与此 cpp 中定义的函数和包含的文件相对应的机器代码才会被构建为此编译单元的对象(二进制)版本(例如 Foo),而不是仅仅声明的那些(例如 Boo)。

  3. 链接 - 这是 C++ 寻找在每个编译单元中声明和调用的内容并将其链接到被调用的地方的阶段。现在,如果没有找到这个函数的定义,链接器就会放弃并出错。类似地,如果它发现同一个函数签名的多个定义(本质上是它所采用的名称和参数类型),它也会出错,因为它认为它不明确并且不想任意选择一个。

后者是您的情况。通过执行 #includefun.cpp文件,两个 fun.cppmainfile.cppfunct() 的定义并且链接器不知道在您的程序中使用哪一个并提示它。

上面提到的 Vaughn 的修复是不包含定义为 funct() 的 cpp 文件。在 mainfile.cpp而是移动 funct() 的声明在单独的头文件中,并将其包含在 mainline.cpp 中.这样编译器会得到 funct() 的声明。使用,链接器只会得到 funct() 的一个定义来自 fun.cpp并将放心使用它。

关于c++ - 多个函数定义错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17904643/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com