【发布时间】:2014-07-09 03:35:49
【问题描述】:
C 示例
bb.c:
#include "bb.h"
#include <stdio.h>
void bb() {
printf("aa()...\n");
aa();
}
main.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();
}
main.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++版本会出现重复错误not?
函数
void a::doit()定义在头文件而不是源文件中是否意味着编译器会自动内联该函数?
【问题讨论】:
-
您的 C 示例不是 C。在 C++ 中,
a::doit隐含为inline。 -
你能解释一下为什么 C 的例子不是 C 吗?
-
对于初学者来说,C 没有
class关键字。 -
你是对的,抱歉我在输出中包含了错误的文件。固定。
-
你没有理解詹姆斯的问题。我不关心
void a::doit()和void b::doit()之间的重复,但事实上void a::doit()在a.hpp和included 中都定义 来自@987654340 @ 和b.hpp。我认为@chris 给出了(有点简短但正确的)答案,因为根据问题 2,a::doit隐含为inline。
标签: c++ c inline-functions duplicate-symbol