gpt4 book ai didi

c++ - 为什么在类中定义的 C++ 成员函数不会产生重复符号,而在 C 中会产生重复符号?

转载 作者:太空宇宙 更新时间:2023-11-04 02:48:35 25 4
gpt4 key购买 nike

C 示例

bb.c:

#include "bb.h"
#include <stdio.h>

void bb() {
printf("aa()...\n");
aa();
}

主.c:

#include "aa.h"
#include "bb.h"

int main(int argc, const char** argv) {

aa();
bb();

return 0;
}

aa.h:

#ifndef aa_h
#define aa_h

#include <stdio.h>

void aa() {
printf("aa()...\n");
}

#endif // aa_h

bb.h:

#ifndef bb_h
#define bb_h

#include "aa.h"

void bb();

#endif // bb_h

C 结果

用 clang main.c bb.c 编译:

duplicate symbol _aa in:
/var/folders/f2/2w4c0_n519g8cd2k6xv66hc80000gn/T/main-OsFJVB.o
/var/folders/f2/2w4c0_n519g8cd2k6xv66hc80000gn/T/bb-OkcMzn.o
ld: 1 duplicate symbol for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

C++ 示例

b.cpp:

#include "b.hpp"

void b::do_something_else() {
std::cout << "b::do_something_else() being called..." << std::endl;
a a;
a.doit();
}

主要.cpp:

#include "a.hpp"
#include "b.hpp"

int main() {

a a;
b b;

a.doit();
b.do_something_else();

return 0;
}

a.hpp:

#ifndef a_hpp
#define a_hpp

#include <iostream>

class a{
public:

void doit() {
std::cout << "a::doit() being called..." << std::endl;
}

};

#endif // a_hpp

b.hpp:

#ifndef b_hpp
#define b_hpp

#include "a.hpp"

#include <iostream>

class b{
public:

void do_something_else();

};

#endif // b_hpp

C++ 结果

上面的代码用 clang++ main.cpp b.cpp 编译得很好,程序的输出是:

a::doit() being called...
b::do_something_else() being called...
a::doit() being called...

问题

  1. 为什么 C++ 版本不会出现重复错误?

  2. 函数 void a::doit() 在头文件而不是源文件中定义是否意味着编译器会自动内联函数?

最佳答案

在 C++ 中,类方法不是顶级符号,而是类层次结构中的有效范围名称。

这意味着您在 C++ 中定义了两个 doit() 方法,a::doit()b::doit()

在 C 中,您尝试定义一个 aa() 函数两次。

请注意,如果您定义 doit() 方法两次,在同一类的范围内,C++ 也会报错。

#include <iostream>

class a {

public:

void doit() {
std::cout << "hello" << std::endl;
}

void doit() {
std::cout << "goodbye" << std::endl;
}
};

导致

ed.cpp:11:8: error: ‘void a::doit()’ cannot be overloaded
void doit() {
^
ed.cpp:7:8: error: with ‘void a::doit()’
void doit() {
^

关于c++ - 为什么在类中定义的 C++ 成员函数不会产生重复符号,而在 C 中会产生重复符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24644982/

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