为什么C里没有函数重载

概念:

C++ 允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数/类型/顺序)必须不同,常用来处理实现 功能类似数据类型不同 的问题。

如:

调用编译的语言不同会出现:

  1. C++ 出现错误:
  2. C 出现错误:

可见,在 C 语言的编译器下,编译器将函数名编译为“_函数名”,重载之后,会将所有重载的函数编译为“_函数名”形式。

而 C++ 语言的编译器下,将函数名编译为“?@函数名@@yahhh@Z”的形式,即 函数名+返回值类型+参数类型,所以不会形成相同名字的函数。

小节:

(1) 因此 C 语言中无函数重载(编译方式不同)

(2) 故在 C++ 调用 C 语言代码时会注明 extern “C” 修饰,表示这部分代码会按照 C 语言方式编译和链接(C++ 编译器可以用 C 语言方式编译 C 语言代码)

编译器入门

GCC,GNU Compiler Collection(GNU编译器集合),可编译 C、C++、JAV、Fortran、Pascal、Object-C、Ada 等语言。

gcc,是 GCC 中的 GNU C Compiler (C 编译器)

g++,是 GCC 中的 GNU C++ Compiler (C++编译器)

本质来说,不能说 gcc g++ 是编译器,而是一种“驱动”器,根据命令参数中要编译的文件类型,调用对应的 GNU 编译器。如 gcc 编一个 .c 文件:

  1. Call a preprocessor, like cpp.
  2. Call an actual compiler, like cc or cc1.
  3. Call an assembler, like as.
  4. Call a linker, like ld.

由于编译器是可以替换的,所以 gcc 不仅可以编译 C 文件。所以应解释为:

gcc调用了 C Compiler

g++调用了 C++ Compiler

《区别》

  1. 对于 *.c 和 *.cpp 文件,gcc 分别当做 c 和 cpp 文件编译(c 和 cpp 的语法强度是不同!)
  2. 对于 *.c 和 *.cpp 文件,g++ 会统一当做 cpp 文件来编译
  3. 使用 g++,会自动链接标准库 STL,而 gcc 不会
  4. gcc 编译 c 文件时,使用的预定义宏比较少
  5. gcc 编 cpp 文件 / g++ 编 c 和 cpp 文件时,(这时 gcc 和 g++ 都调用 cpp 文件的编译器),会加入额外宏定义:
  6. 在用 gcc 编译 cpp 文件时,为了能用 STL,需要加上参数 -lstdc++,但这不代表 g++ -lstdc++ 等价于 g++,一些常见的参数如下:

     

留下评论