C/C++ 函數聲明與定義分開的必要性。防止函數重定義的三種方法。

大家都知道,我們在寫項目的時候習慣性的將函數聲明與定義分開來寫,通常函數聲明放在.h文件中,函數定義放在.cpp文件中,那麼這麼做的原因是什麼呢?
這是我在練習時遇到的一個問題:
我有三個文件:

  1. a.h文件
#include<iostream>
using namespace std;
void print1()
{
	cout<<"hello world" <<endl;
}
void print2();

  1. a.cpp

#include"a.h"
void print2()
{
		cout<<" hello C++"  <<endl;
}
  1. main.cpp
#include"a.h"
int main()
{
return 0;
}

當我編譯代碼的時候出現了下面的問題:
在這裏插入圖片描述
後來在網上找這個錯誤的原因:
因爲我在a.h文件中定義了函數print1,而a.c包含了a.h文件,那麼在a.c生成目標文件時就包含了print1的實現(定義),而mian.c同樣包含了a.h文件,那麼main.cpp在生成目標文件時也就包含了print1的實現,這樣二者在鏈接階段就會發現有兩個一模一樣的函數,出現了重定義的問題。 而將聲明放在a.h文件,定義放在a.c文件中的print2函數就不存在重定義問題。
因此解決這個問題的一個方法就是:
1.將函數的聲明與定義分開。
此外我還找到了第二個解決這個問題的方法:
2.將函數設置爲內聯函數,即加上inline關鍵字
這個方法實際上是在調用處展開函數體代碼,代替函數調用。

其實解決這個問題的方法還有一種:
3.將函數設置爲靜態的。加static關鍵字。
我們知道用static修飾一個函數時,該函數只在當前文件中可見,其他文件內無法調用。那麼我們將print1函數設置爲靜態的,那麼即使mian.cpp 和 a.c中都包含了a.h文件,當生成目標文件時,每一個cpp文件都會有自己的靜態函數,它們彼此之間不可見,那麼也就不存在重定義的問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章