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

标签 c++ c inline-functions duplicate-symbol

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/

相关文章:

c++ - 当我用 gcc 替换 g++ 时,为什么我的 makefile 失败了?

c++ - 如何从注册表更改高级设置

从另一个函数调用 main

c++ - 如何在 C/C++ 中编写一个简单的整数循环缓冲区?

android - 如何在android服务器和c客户端之间同步时间?

将内联函数转换为宏

c++ - 从文本文件中读取行并将字符串放入 vector 中?

随着时间的推移,C++ 代码运行速度越来越慢

c++ - 类中定义的函数是否总是内联的?

c++ - 内联函数/方法