這是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表示,如果預處理器已定...