为什么C里没有函数重载
概念:
C++ 允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数/类型/顺序)必须不同,常用来处理实现 功能类似,数据类型不同 的问题。
如:
1 2 |
int add( int a, int b ); char add( char a, char b ); |
调用编译的语言不同会出现:
- C++ 出现错误:
12无法解析外部符号 "int __cdecl add(int,int)" (?add@@YAHHH@Z)该符号在函数 _main 中被引用 - C 出现错误:
12无法解析外部符号 "_add"该符号在函数 _main 中被引用
可见,在 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 文件:
- Call a preprocessor, like cpp.
- Call an actual compiler, like cc or cc1.
- Call an assembler, like as.
- Call a linker, like ld.
由于编译器是可以替换的,所以 gcc 不仅可以编译 C 文件。所以应解释为:
gcc调用了 C Compiler
g++调用了 C++ Compiler
《区别》
- 对于 *.c 和 *.cpp 文件,gcc 分别当做 c 和 cpp 文件编译(c 和 cpp 的语法强度是不同!)
- 对于 *.c 和 *.cpp 文件,g++ 会统一当做 cpp 文件来编译
- 使用 g++,会自动链接标准库 STL,而 gcc 不会
- gcc 编译 c 文件时,使用的预定义宏比较少
- gcc 编 cpp 文件 / g++ 编 c 和 cpp 文件时,(这时 gcc 和 g++ 都调用 cpp 文件的编译器),会加入额外宏定义:
12345#define __GXX_WEAK__ 1#define __cplusplus 1#define __DEPRECATED 1#define __EXCEPTIONS 1#define __private_extern__ extern - 在用 gcc 编译 cpp 文件时,为了能用 STL,需要加上参数 -lstdc++,但这不代表 g++ -lstdc++ 等价于 g++,一些常见的参数如下:
1234567891011-g : turn on debugging ( so GDB gives morefriendly output )-Wall : turns on most warnings-O or -O2 : turn on optimizations-o : name of the output file-c : output an object file (.o)-l : specify an includedirectory-L : specify an libdirectory-I : link with librarylib.aexample:g++ -o helloworld -I/home/me/place/include helloworld.c
评论已关闭。