編譯預處理系列3

2021-08-29 03:25:48 字數 1258 閱讀 1881

#define後有定義項卻無被定義項,為什麼

編號:qa003234

建立日期:

2023年8月1日

最後修改日期:

2023年8月1日

所屬類別:

c/c++ - 新手問題

作業系統: win98 vc++6.0

程式設計工具: vc++6.0

問題: 專家你好!

我是一名「早期的」程式設計愛好者,較熟悉tc。但最近轉向windows程式設計時,經常發生一些令我費解的問題,如下例:

c++標頭檔案的預編譯經常出現#define後有定義項卻無被定義項的情況,如:

在#if !defined(afx_mainfrm_h__be42e62a_5388_11d4_a37f_9b105b2cf13d__included_)

#define afx_mainfrm_h__be42e62a_5388_11d4_a37f_9b105b2cf13d__included_中,afx_mainfrm_h__be42e62a_5388_11d4_a37f_9b105b2cf13d__included_被定義成了什麼,這句話是什麼意思,我不明白,請指教。

水平: 剛入門(kittle)

象這種情況是為了避免標頭檔案被多次包含。假設有a.h,b.h包含了a.h,,而c.h又包含了a.h和b.h,這樣在編譯c.h時會出錯,因為a.h中的定義被宣告了兩次。為了解決這個問題,就採用了這樣的機制,把a.h寫成:

#if !defined(afx_mainfrm_h__be42e62a_5388_11d4_a37f_9b105b2cf13d__included_)

// 如果沒有包含過mainfrm.h,就定義以下內容

#define afx_mainfrm_h__be42e62a_5388_11d4_a37f_9b105b2cf13d__included_

.....

#endif

這裡的符號afx_mainfrm_h__be42e62a_5388_11d4_a37f_9b105b2cf13d__included_只是為了表示是否包含了mainfrm.h,如果使用#define定義了,則defined(afx_mainfrm_h__be42e62a_5388_11d4_a37f_9b105b2cf13d__included_)返回真。至於符號afx_mainfrm_h__be42e62a_5388_11d4_a37f_9b105b2cf13d__included_的值到底是什麼並無所謂(實際被定義為空),我們關心的只是是否定義過。

編譯預處理

所謂編譯預處理,就是在c源程式的編譯之前,由編譯預處理程式對這些編譯預處理命令進行處理的過程。最常見的就是常量的替換。編譯預處理按功能可以分為巨集定義,檔案包含和條件編譯三類。編譯預處理命令以 開頭,下面進行詳細說明 一.巨集定義與符號常量 1.無參巨集定義 define 識別符號 字串 1 巨集名...

編譯預處理

1.巨集定義指令 1 定義變數與命令 避免幻數 在巨集定義命名時,盡量能清楚的表明功能,大寫 不能以 開頭易與內建巨集衝突 2 定義巨集函式 define max a,b a b a b int num max 6,5 6 5 6 5 用編譯時間換記憶體空間的是巨集函式 用記憶體空間換執行空間的是內...

編譯預處理

1 定義常量與命令 避免幻數 定義巨集時,避免以 開頭,以防與內建巨集定義衝突。巨集和列舉的區別 a.列舉常量是實體常量中的一種,但巨集不是實體 b.列舉常量屬於常量,但巨集不是常量 c.列舉常量具有型別,但巨集沒有型別。列舉型別主要用於限制性輸入,巨集只是預處理替換符 d.列舉只可以表示整型,巨集...