c 的基礎知識 函式過載

2021-08-20 08:51:56 字數 2514 閱讀 8637

函式過載:在

c語言裡,在同檔案裡不可以有同名的函式

.在c++裡可以有多個函式同名

.例如我們要實現不同型別變數的

add函式:1

2 #include

34 using namespace std;

56 int add(int a, int b)

7 11

12 double add(double a, double b)

13 17

18 double add(double a, int b, int c)

19 22

23 int main(void)

24 編譯執行後的輸出

:[root@localhost 04func_overloaded]# ./a.out

int add

77double add

77.221

說明c++裡可實現多個同名的函式

,編譯時編譯器會自動根據引數的個數及型別呼叫相應的函式.揭秘

:檢視程式映象裡的函式名:

[root@localhost 04func_overloaded]# nm a.out | grep add

0000000000400a87 t _global__sub_i__z3addii

0000000000400944 t _z3adddd

0000000000400990 t _z3adddii

0000000000400910 t _z3addii

說明在c++裡最終編譯生成的函式名與**裡寫的函式名並不完全相同,與引數的個數,引數的型別有關係

.與返回值型別無關

.與引數名也無關.在

c**裡編譯出的程式裡的函式名與源檔名裡的函式名相同.1

2 #include

34 int add(int a, int b)5 8

9 int main(void)

10 13

用gcc編譯後檢視

:[root@localhost 04func_overloaded]# nm a.out | grep add

00000000004004f0 t add

在c++在使用

c語言寫好的庫時的問題

:c編譯出的庫的函式名是固定的,與源檔名裡相同。

在c++編譯時,函式是與引數個數,引數型別變化的。所以在

c++裡呼叫

c庫的函式時需要作一些處理.如

mylib.h

12 #ifndef __mylib_h

3 #define __mylib_h

45 void myhello(char *);

67 #endif /* __mylib_h */

如mylib.c編譯成

c動態庫

12 #include

34 void myhello(char *p)

5 編譯成動態庫

:gcc mylib.c -fpic -shared -o libmylib.so

在c++裡呼叫上面的動態庫,則需

libmylib.so mylib.h

12 #include

3 #include "mylib.h"

45 int main(void)

6 [root@localhost usage]# g++ test.cpp ./libmylib.so

test.cpp: in function 『int main()』:

test.cpp:7:15: warning: deprecated conversion from string constant to『char*』 [-wwrite-strings]

myhello("kkk");

^/tmp/cck5rkcu.o: in function `main':

test.cpp:(.text+0xa): undefined reference to `myhello(char*)'

collect2: error: ld returned 1 exit status

編譯時還是報錯,找不到

myhello函式。因

c++這邊需要找函式名像

:_z3myhellopc這樣的函式

,我們的庫的函式名不是這樣的

.我們要告訴編譯器,此函式是

c語言寫的,函式名是不變的才行.修改

c++**如下即可編譯通過:1

2 #include

34 extern "c" ;

78 int main(void)

9 通過情況下是寫庫這邊需要作相容的行為的:修改

mylib.h

12 #ifndef __mylib_h

3 #define __mylib_h

45 #ifdef __cplusplus

6 extern "c"

12 #endif

1314 #endif /* __mylib_h */

修改後,不管是在

c還是c++即可通用

.

C 基礎知識(函式過載)

1 函式過載overload 概述 c 中允許出現同名函式,這種現象就叫函式過載。函式過載的目的是為了方便使用函式名。2 函式過載 2.1基本語法 實現函式過載的條件 1 同乙個作用域 2 引數個數不同 3 引數型別不同 4 引數順序不同。注 返回值不作為過載的依據。函式過載和預設引數設定一起使用時...

c 基礎知識7 函式過載

過載函式 含義 c語言中,函式如果重名會報錯。c 則引入了函式過載。編譯器將所有同名函式作為候選者,精確匹配實參 通過預設引數匹配實參 通過預設型別轉換匹配實參等等,尋找到正確的函式 如果匹配到不唯一或匹配不到,則編譯錯誤。本質 通過編譯後生成的obj檔案進行分析,可以看到同名函式在符號表中有不同的...

C 基礎知識 函式

寫在前面 在剛上大學的時候,學習各種各樣的計算機基礎知識,對我而言,剛開的時候我是不理解的,知識太抽象,只是機械的記住了概念和用法,往往忽略了一些細節。當自己實踐增多的時候,各種知識漸漸的清晰起來,所有東西都是有來龍去脈的,原來不理解的東西都豁然開朗起來。這個時候再取回顧原來學習的知識技能,又有一種...