C語言預處理之條件編譯

2021-05-23 08:42:11 字數 1593 閱讀 4472

這是stdio.h的頭幾行:

#if     _msc_ver > 1000

#pragma once

#endif

#ifndef _inc_stdio

#define _inc_stdio

#if     !defined(_win32) && !defined(_mac)

#error error: only mac or win32 targets supported!

#endif

...我們知道條件編譯有好幾種形式:

1. 第一種形式:

#ifdef 識別符號

程式段1

#else

程式段2

#endif

它的功能是,如果識別符號已被 #define命令定義過則對程式段1進行編譯;否則對程式段2進行編譯。如果沒有程式段2(它為空),本格式中的#else可以沒有, 即可以寫為:

#ifdef 識別符號

程式段 #endif

2. 第二種形式:

#ifndef 識別符號

程式段1

#else

程式段2

#endif

與第一種形式的區別是將「ifdef」改為「ifndef」。它的功能是,如果識別符號未被#define命令定義過則對程式段1進行編譯, 否則對程式段2進行編譯。這與第一種形式的功能正相反。

3. 第三種形式:

#if 常量表示式

程式段1

#else

程式段2

#endif

它的功能是,如常量表示式的值為真(非0),則對程式段1 進行編譯,否則對程式段2進行編譯。因此可以使程式在不同條件下,完成不同的功能。

舉例:#if     ( !defined(_msc_ver) && !defined(__cdecl) )

#define __cdecl

#endif

這裡涉及到defined(),用於判斷括號中的變數是否被定義。

我們在寫條件編譯語句時一般寫成:

#ifndef     _inc_stdio

#define     _inc_stdio     常量

#endif

當然這裡的名字不合適,我只是表意一下。

但在很多程式的源**中,只定義了識別符號而沒有定義常量(value)!就像前面程式中的

#ifndef _inc_stdio

#define _inc_stdio

這下我就不明白了,怎麼能沒有值呢?以後怎麼用啊?

查了好多網頁和問了好幾個人,終於差不多搞明白了。

結論:_inc_stdio只是乙個識別符號,可以不定義值。這個識別符號可以用來控制程式的流程。如果沒有定義識別符號***,則定義識別符號***。

條件編譯允許只編譯源程式中滿足條件的程式段,使生成的目標程式較短,從而減少了記憶體的開銷並提高了程式的效率。

使用預處理功能便於程式的修改、閱讀、移植和除錯,也便於實現模組化程式設計。

下面這段程式有點不解:為什麼輸出兩次_a_ is defined!?

我認為只輸出一次,但執行了一下(vc 6.0),居然輸出了兩次!

希望各位大蝦們不吝賜教,謝謝!

C 預處理 之 條件編譯

序號描述 1展開所有的標頭檔案 2巨集定義的替換 3解析條件編譯 並新增到檔案中 預處理命令 以符號 開頭。採用 條件編譯,可以減少被編譯的語句,從而減少目標的長度。當 條件編譯 段比較多時,目標程式長度可以大大減少。序號命令含義 1 if 編譯預處理 的 條件命令,相當於c語言中的 if 語句 2...

C語言 預處理指令 條件編譯

感謝 一 條件編譯 概念 在很多情況下,我們希望程式的其中一部分 只有在滿足一定條件時才進行編譯,否則不參與編譯 只有參與編譯的 最終才能被執行 這就是條件編譯。二 基本用法 1.if 條件1 code1.elif 條件2 code2.else code3.endif1 如果條件1成立,那麼編譯器就...

自用C語言篇 預處理 條件編譯

擴充套件if define 的一般格式 ifndef if elif和 else 在部分情況下,希望程式的其中一部分 只有在滿足一定條件時才進行編譯,否則不參與編譯 只有參與編譯的 最終才能被執行 這就是條件編譯。可以使用相關指令告訴編譯器根據條件執行或忽略相關 塊 ifdef表示,如果預處理器已定...