c 中的重定義,重包含。

2021-08-22 06:01:29 字數 935 閱讀 4953

1.重定義的概念

乙個變數被直接或者間接多次定義導致的錯誤

導致重定義的三種情況

第一種:就是同乙個變數多次在乙個檔案中定義,例如:int a=1;int a=2;(a就是 重定義)

第二種:由於重複包含標頭檔案導致的變數的重定義,例如在a.h中定義了乙個變數 int a=3;後來b.h包含了a.h,並且又在b.h中定義了int a=7;(這種情況不好解決,所以我們不建議在標頭檔案裡面定義全域性變數)

第三種: 就是因為在乙個專案裡面多次定義乙個相同的變數;例如,在a.cpp中定義了int a=1;又在b.cpp中再次定義了int a=9;

第四種:就是由於巢狀包含導致的標頭檔案的重複包含而導致的重定義,比如:b.h包含了a.h,c.h包含了b.h,在c.h中寫#include

相同點:作用都是解決重複包含的問題,保證同乙個標頭檔案不會重複包函多次

# ifndef的方式依賴於巨集名字不能衝突,這不光可以保證同乙個檔案不會被包含多次,也能保證內容完全相同的兩個檔案不會被不小心同時包含。

缺點就是如果不同標頭檔案的巨集名不小心「撞車」,可能就會導致標頭檔案明明存在,編譯器卻硬說找不到宣告的狀況  。編譯器每次開啟標頭檔案都會有檢查是否有重定義。編譯的時間較長
#pragma once則由編譯器提供保證:同乙個檔案不會被包含多次。注意這裡所說的「同乙個檔案」是指物理上的乙個檔案,而不是指內容相同的兩個檔案帶來的好處是,你不必再費勁想個巨集名了,當然也就不會出現巨集名碰撞引發的奇怪問題。缺點就是如果某個標頭檔案有多份拷貝,本方法不能保證他們不被重複包含。

相比巨集名碰撞引發的「找不到宣告」的問題,重複包含更容易被發現並修正**

*方式一由語言支援所以移植性好,方式二 可以避免名字衝突*

重定義的解決

重複包含引起的重定義

C 中的型別重定義

發現重複定義是由於從兩個不同的路徑包含了同乙個標頭檔案而引起的,同事也建議從另外乙個路徑開啟工程試試,這才慢慢發現了原因。這個原因可能有些拗口,而事實上要出現這種錯誤也有些 曲折 讓我從不同情況下的型別重定義來解釋一下吧。我總結的型別重定義情況有三。一 沒有在檔案頭加 pragma once指示符。...

C 中過載 重寫 重定義

過載 1 作用域相同。2 函式名相同,引數列表不同。3 與返回值無關。例 同乙個類的建構函式和拷貝建構函式構成過載。class a a const a a 重寫 覆蓋 1 不在同一作用域 分別為基類和派生類 2 函式名相同,引數列表相同,返回值相同。3 基類成員函式必須有virtual關鍵字修飾。4...

c 中的過載,重寫,重定義

c 中的幾個容易混淆的概念 1 過載 在同一作用域中,函式名相同,引數列表不同,返回值可同可不同的函式。關於函式過載的知識在 函式過載 這篇部落格中有詳細介紹。2 重寫 又叫覆蓋,是指不在同乙個作用域中 分別在父類和子類中 函式名,參 數個數,引數型別,返回值型別都相同,並且父類函式必須有virtu...