C語言預先處理之條件編譯

來源:互聯網
上載者:User
這是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只是一個標識符,可以不定義值。這個標識符可以用來控製程序的流程。如果沒有定義標識符XXX,則定義標識符XXX。 條件編譯允許只編譯來源程式中滿足條件的程式段,使產生的目標程式較短,從而減少了記憶體的開銷並提高了程式的效率。使用預先處理功能便於程式的修改、閱讀、移植和調試,也便於實現模組化程式設計。 下面這段程式有點不解:為什麼輸出兩次_A_ is defined!?#include <stdio.h><br />#ifndef _A_<br />#define _A_<br />#endif<br />void myfunc();<br />void main()<br />{<br /> myfunc();<br /> myfunc();<br />}<br />void myfunc()<br />{<br />#ifdef _A_<br /> printf("_A_ is defined!/n");<br />#undef _A_<br />#endif<br />}<br />我認為只輸出一次,但運行了一下(VC 6.0),居然輸出了兩次!希望各位大蝦們不吝賜教,謝謝!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.