函式放在標頭檔案中被多次包含的重定義問題

2021-10-16 09:47:37 字數 507 閱讀 9074

.**件被多次定義或.o:第一次在此定義問題

場景一:函式在標頭檔案被定義,參看

場景二:標頭檔案中定義的型別、結構體被例項化

例如:

struct har

h[2];

在定義結構體同時還定義結構體型別變數h,若該標頭檔案被多次包含,則可能報錯:

g++ -std=c++11 -g main.o aa.o bb.o -o aa

aa.o:(.bss+0x0): `h'

main.o:(.bss+0x0):第一次在此定義

bb.o:(.bss+0x0): `h'被多次定義

main.o:*/main.cpp:6:第一次在此定義

collect2: error: ld returned 1 exit status

makefile:9: recipe for target 'aa' failed

make: *** [aa] error 1

將函式實現放在標頭檔案中

因為多個原始檔包含了含有函式定義的標頭檔案,在編譯的時候,每個原始檔都會包含乙份函式定義,在鏈結時編譯器不知道需要連線哪乙份函式定義。解決方法有三個 1.inline關鍵字 可以用關鍵字inline修飾函式定義,例如 inline int add int x,int y 使用inline關鍵字,編譯...

inline函式的定義放在標頭檔案中

inline是加在實現上,就算加在宣告上,編譯器也會忽略掉。內聯展開是在編譯時進行的,只有鏈結的時候原始檔之間才有關係。所以內聯要想跨原始檔必須把實現寫在標頭檔案裡。如果乙個 inline 函式會在多個原始檔中被用到,那麼必須把它定義在標頭檔案中。注意 將函式的定義 之間的部分 放在標頭檔案中是強制...

ctype標頭檔案所包含的函式

include 的函式 c 中應該是 include c中應該是 include 以下為字元函式庫中常用的函式 函式名稱 返回值isalnum 如果引數是字母數字,即字母或數字,該函式返回true isalpha 如果引數是字母,該函式返回真 isblank 如果引數是空格或水平製表符,該函式返回t...