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