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...
问题
为什么 C++ 版本不会出现重复错误?
函数
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/