中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
C語(yǔ)言中的預(yù)處理詳解

目錄
 

一.預(yù)處理的工作方式... 3
1.1.預(yù)處理的功能... 3
1.2預(yù)處理的工作方式... 3
二.預(yù)處理指令... 4
2.1.預(yù)處理指令... 4
2.2.指令規(guī)則... 4
三.宏定義命令----#define. 4
3.1.無(wú)參數(shù)的宏... 4
3.2帶參數(shù)的宏... 5
3.3.預(yù)處理操作符#和##. 6
3.3.1.操作符#. 6
3.3.2.操作符##. 6
四.文件包含------include. 6
五.條件編譯... 7
5.1使用#if 7
5.2使用#ifdef和#ifndef 9
5.3使用#defined和#undef 10
六.其他預(yù)處理命令... 11
6.1.預(yù)定義的宏名... 11
6.2.重置行號(hào)和文件名命令------------#line. 11
6.3.修改編譯器設(shè)置命令 ------------#pragma. 12
6.4.產(chǎn)生錯(cuò)誤信息命令 ------------#error 12
七.內(nèi)聯(lián)函數(shù)... 13

 

 

 

在嵌入式系統(tǒng)編程中不管是內(nèi)核的驅(qū)動(dòng)程序還是應(yīng)用程序的編寫(xiě),涉及到大量的預(yù)處理與條件編譯,這樣做的好處主要體現(xiàn)在代碼的移植性強(qiáng)以及代碼的修改方便等方面。因此引入了預(yù)處理與條件編譯的概念。
在C語(yǔ)言的程序中可包括各種以符號(hào)#開(kāi)頭的編譯指令,這些指令稱(chēng)為預(yù)處理命令。預(yù)處理命令屬于C語(yǔ)言編譯器,而不是C語(yǔ)言的組成部分。通過(guò)預(yù)處理命令可擴(kuò)展C語(yǔ)言程序設(shè)計(jì)的環(huán)境。

一.預(yù)處理的工作方式
 
1.1.預(yù)處理的功能
 
    在集成開(kāi)發(fā)環(huán)境中,編譯,鏈接是同時(shí)完成的。其實(shí),C語(yǔ)言編譯器在對(duì)源代碼編譯之前,還需要進(jìn)一步的處理:預(yù)編譯。預(yù)編譯的主要作用如下:
●將源文件中以”include”格式包含的文件復(fù)制到編譯的源文件中。
●用實(shí)際值替換用“#define”定義的字符串。
●根據(jù)“#if”后面的條件決定需要編譯的代碼。
 


1.2預(yù)處理的工作方式
 
預(yù)處理的行為是由指令控制的。這些指令是由#字符開(kāi)頭的一些命令。
#define指令定義了一個(gè)宏---用來(lái)代表其他東西的一個(gè)命令,通常是某一個(gè)類(lèi)型的常量。預(yù)處理會(huì)通過(guò)將宏的名字和它的定義存儲(chǔ)在一起來(lái)響應(yīng)#define指令。當(dāng)這個(gè)宏在后面的程序中使用到時(shí),預(yù)處理器”擴(kuò)展”了宏,將宏替換為它所定義的值。
#include指令告訴預(yù)處理器打開(kāi)一個(gè)特定的文件,將它的內(nèi)容作為正在編譯的文件的一部分“包含”進(jìn)來(lái)。例如:下面這行命令:
#include<stdio.h>

指示預(yù)處理器打開(kāi)一個(gè)名字為stdio.h的文件,并將它的內(nèi)容加到當(dāng)前的程序中。
預(yù)處理器的輸入是一個(gè)C語(yǔ)言程序,程序可能包含指令。預(yù)處理器會(huì)執(zhí)行這些指令,并在處理過(guò)程中刪除這些指令。預(yù)處理器的輸出是另外一個(gè)程序:原程序的一個(gè)編輯后的版本,不再包含指令。預(yù)處理器的輸出被直接交給編譯器,編譯器檢查程序是否有錯(cuò)誤,并經(jīng)程序翻譯為目標(biāo)代碼。
 


二.預(yù)處理指令
 
 2.1.預(yù)處理指令
 
大多數(shù)預(yù)處理器指令屬于下面3種類(lèi)型:
●宏定義:#define 指令定義一個(gè)宏,#undef指令刪除一個(gè)宏定義。
●文件包含:#include指令導(dǎo)致一個(gè)指定文件的內(nèi)容被包含到程序中。
●條件編譯:#if,#ifdef,#ifndef,#elif,#else和#dendif指令可以根據(jù)編譯器可以測(cè)試的條件來(lái)將一段文本包含到程序中或排除在程序之外。
剩下的#error,#line和#pragma指令更特殊的指令,較少用到。
 


2.2.指令規(guī)則
 
●指令都是以#開(kāi)始。#符號(hào)不需要在一行的行首,只要她之前有空白字符就行。在#后是指令名,接著是指令所需要的其他信息。
●在指令的符號(hào)之間可以插入任意數(shù)量的空格或橫向制表符。
●指令總是第一個(gè)換行符處結(jié)束,除非明確地指明要繼續(xù)。
●指令可以出現(xiàn)在程序中德任何地方。我們通常將#define和#include指令放在文件的開(kāi)始,其他指令則放在后面,甚至在函數(shù)定義的中間。
●注釋可以與指令放在同一行。

 


三.宏定義命令----#define   
      
使用#define命令并不是真正的定義符號(hào)常量,而是定義一個(gè)可以替換的宏。被定義為宏的標(biāo)示符稱(chēng)為“宏名”。在編譯預(yù)處理過(guò)程時(shí),對(duì)程序中所有出現(xiàn)的“宏名”,都用宏定義中的字符串去代換,這稱(chēng)為“宏代換”或“宏展開(kāi)”。
在C語(yǔ)言中,宏分為有參數(shù)和無(wú)參數(shù)兩種。
 


3.1.無(wú)參數(shù)的宏
    其定義格式如下:
#define 宏名  字符串
在以上宏定義語(yǔ)句中,各部分的含義如下:
● #:表示這是一條預(yù)處理命令(凡是以“#”開(kāi)始的均為預(yù)處理命令)。
●define:關(guān)鍵字“define”為宏定義命令。
●宏名:是一個(gè)標(biāo)示符,必須符合C語(yǔ)言標(biāo)示符的規(guī)定,一般以大寫(xiě)字母標(biāo)示宏名。
●字符串:可以是常數(shù),表達(dá)式,格式串等。在前面使用的符號(hào)常量的定義就是一個(gè)無(wú)參數(shù)宏定義。
Notice:

預(yù)處理命令語(yǔ)句后面一般不會(huì)添加分號(hào),如果在#define最后有分號(hào),在宏替換時(shí)分號(hào)也將替換到源代碼中去。在宏名和字符串之間可以有任意個(gè)空格。
Eg:#define PI 3.14

在使用宏定義時(shí),還需要注意以下幾點(diǎn):
●宏定義是宏名來(lái)表示一個(gè)字符串,在宏展開(kāi)時(shí)又以該字符串取代宏名。這只是一種簡(jiǎn)單的代換,字符串中可以含任何字符,可以是常數(shù),也可以是表達(dá)式,預(yù)處理程序?qū)λ蛔魅魏螜z查。如有錯(cuò)誤,只能在編譯已被宏展開(kāi)后的源程序時(shí)發(fā)現(xiàn)。
●宏定義必須寫(xiě)在函數(shù)之外,其作用域?yàn)楹甓x命令起到源程序結(jié)束。
●宏名在源程序只能夠若用引號(hào)括起來(lái),則預(yù)處理程序不對(duì)其作宏替換。
●宏定義允許嵌套,在宏定義的字符串中可以使用已經(jīng)定義的宏名。在宏展開(kāi)時(shí)由預(yù)處理程序?qū)訉犹鎿Q。
●習(xí)慣上宏名可用大寫(xiě)字母表示,以方便與變量區(qū)別。但也允許用小寫(xiě)字母。
 


3.2帶參數(shù)的宏
 
#define命令定義宏時(shí),還可以為宏設(shè)置參數(shù)。與函數(shù)中的參數(shù)類(lèi)似,在宏定于中的參數(shù)為形式參數(shù),在宏調(diào)用中的參數(shù)稱(chēng)為實(shí)際參數(shù)。對(duì)帶參數(shù)的宏,在調(diào)用中,不僅要宏展開(kāi),還要用實(shí)參去代換形參。
帶參宏定義的一般形式為:
#define 宏名(形參表)  字符串
在定義帶參數(shù)的宏時(shí),宏名和形參表之間不能有空格出現(xiàn),否則,就將宏定義成為無(wú)參數(shù)形式,而導(dǎo)致程序出錯(cuò)。
Eg:#define ABS(x) (x)<0?-(x):(x)

 以上的宏定義中,如果x的值小于0,則使用一元運(yùn)算符(-)對(duì)其取負(fù),得到正數(shù)。
帶參的宏和帶參的函數(shù)相似,但其本質(zhì)是不同的。使用帶參宏時(shí),在預(yù)處理時(shí)將程序源代碼替換到相應(yīng)的位置,編譯時(shí)得到完整的目標(biāo)代碼,而不進(jìn)行函數(shù)調(diào)用,因此程序執(zhí)行效率要高些。而函數(shù)調(diào)用只需要編譯一次函數(shù),代碼量較少,一般情況下,對(duì)于簡(jiǎn)單的功能,可使用宏替換的形式來(lái)使用。
 


3.3.預(yù)處理操作符#和##
 
3.3.1.操作符#
 
   在使用#define定義宏時(shí),可使用操作符#在字符串中輸出實(shí)參。Eg:

#define AREA(x,y) printf(“長(zhǎng)為“#x”,寬為“#y”的長(zhǎng)方形的面積:%d\n”,(x)*(y));


 
3.3.2.操作符##
 
與操作符#類(lèi)似,操作符##也可用在帶參宏中替換部分內(nèi)容。該操作符將宏中的兩個(gè)部分連接成一個(gè)內(nèi)容。例如,定義如下宏:
#define VAR(n)   v##n

當(dāng)使用一下方式引用宏:
VAR(1)

預(yù)處理時(shí),將得到以下形式:
V1

如果使用以下宏定義:
#define FUNC(n)  oper##n

當(dāng)實(shí)參為1時(shí),預(yù)處理后得到一下形式:
oper1

 


四.文件包含------include
 
     當(dāng)一個(gè)C語(yǔ)言程序由多個(gè)文件模塊組成時(shí),主模塊中一般包含main函數(shù)和一些當(dāng)前程序?qū)S玫暮瘮?shù)。程序從main函數(shù)開(kāi)始執(zhí)行,在執(zhí)行過(guò)程中,可調(diào)用當(dāng)前文件中的函數(shù),也可調(diào)用其他文件模塊中的函數(shù)。
    如果在模塊中要調(diào)用其他文件模塊中的函數(shù),首先必須在主模塊中聲明該函數(shù)原型。一般都是采用文件包含的方法,包含其他文件模塊的頭文件。
文件包含中指定的文件名即可以用引號(hào)括起來(lái),也可以用尖括號(hào)括起來(lái),格式如下:
#include< 文件名>


#include“文件名”
如果使用尖括號(hào)<>括起文件名,則編譯程序?qū)⒌紺語(yǔ)言開(kāi)發(fā)環(huán)境中設(shè)置好的 include文件中去找指定的文件。
因?yàn)镃語(yǔ)言的標(biāo)準(zhǔn)頭文件都存放在include文件夾中,所以一般對(duì)標(biāo)準(zhǔn)頭文件采用尖括號(hào);對(duì)編程自己編寫(xiě)的文件,則使用雙引號(hào)。如果自己編寫(xiě)的文件不是存放在當(dāng)前工作文件夾,可以在#include命令后面加在路徑。
 #include命令的作用是把指定的文件模塊內(nèi)容插入到#include所在的位置,當(dāng)程序編譯鏈接時(shí),系統(tǒng)會(huì)把所有#include指定的文件鏈接生成可執(zhí)行代碼。文件包含必須以#開(kāi)頭,表示這是編譯預(yù)處理命令,行尾不能用分號(hào)結(jié)束。
  #include所包含的文件,其擴(kuò)展名可以是“.c”,表示包含普通C語(yǔ)言源程序。也可以是 “.h”,表示C語(yǔ)言程序的頭文件。C語(yǔ)言系統(tǒng)中大量的定義與聲明是以頭文件形式提供的。
通過(guò)#define包含進(jìn)來(lái)的文件模塊中還可以再包含其他文件,這種用法稱(chēng)為嵌套包含。嵌套的層數(shù)與具體C語(yǔ)言系統(tǒng)有關(guān),但是一般可以嵌套8層以上。

 


五.條件編譯
 
預(yù)處理器還提供了條件編譯功能。在預(yù)處理時(shí),按照不同的條件去編譯程序的不同部分,從而得到不同的目標(biāo)代碼。使用條件編譯,可方便地處理程序的調(diào)試版本和正式版本,也可使用條件編譯使程序的移植更方便。

5.1使用#if
與C語(yǔ)言的條件分支語(yǔ)句類(lèi)似,在預(yù)處理時(shí),也可以使用分支,根據(jù)不同的情況編譯不同的源代碼段。
#if 的使用格式如下:
#if 常量表達(dá)式
   程序段
#else

  程序段
#endif

該條件編譯命令的執(zhí)行過(guò)程為:若常量表達(dá)式的值為真(非0),則對(duì)程序段1進(jìn)行編譯,否則對(duì)程序段2進(jìn)行編譯。因此可以使程序在不同條件下完成不同的功能。
Eg:

#define DEBUG 1

 

int main()

{

   int i,j;

   char ch[26];

  

   for(i='a';j=0;i<='z';i++,j++)

   {

       ch[j]=i;

       #if DEBUG

          printf("ch[%d]=%c\n",j,ch[j]);

       #endif

   }

   for(j=0;j<26;j++)

   {

       printf("%c",ch[j]);

   }

   return 0;

}

#if預(yù)編譯命令還可使用多分支語(yǔ)句格式,具體格式如下:
#if 常量表達(dá)式 1

    程序段 1

#elif 常量表達(dá)式 2

    程序段 2

… …

#elif 常量表達(dá)式 n

    程序段 n

#else

    程序段 m

#endif

 

關(guān)鍵字#elif與多分支if語(yǔ)句中的else if類(lèi)似。
Eg:

#define os win

#if os=win

    #include"win.h"

#elif os=linux

    #include"linux.h"

#elif os=mac

    #include"mac.h"

#endif

 

#if和#elif還可以進(jìn)行嵌套,C89標(biāo)準(zhǔn)中,嵌套深度可以到達(dá)8層,而C99允許嵌套達(dá)到63層。在嵌套時(shí),每個(gè)#endif,#else或#elif與最近的#if或#elif配對(duì)。
Eg:

#define MAX 100

#define OLD -1

 

int main()

{

int i;

#if MAX>50

 

    #if OLD>3

    {

        i=1;

    {

    #elif OLD>0

    {

        i=2;

    }

    #else

    {

        i=3;

    }

    #endif

}

#else

{

    #if OLD>3

    {

        i=4;

    }

    #elif OLD>4

    {

        i=5;

    }

    #else

    {

        i=6;

    }

    #endif

}

#endif

return 0;

}

 


5.2使用#ifdef和#ifndef
 
在上面的#if條件編譯命令中,需要判斷符號(hào)常量定義的具體值。在很多情況下,其實(shí)不需要判斷符號(hào)常量的值,只需要判斷是否定義了該符號(hào)常量。這時(shí),可不使用#if命令,而使用另外一個(gè)預(yù)編譯命令———#ifdef.

#ifdef命令的使用格式如下:
#ifdef 標(biāo)識(shí)符
程序段 1

#else

    程序段 2

#endif

其意義是,如果#ifdef后面的標(biāo)識(shí)符已被定義過(guò),則對(duì)“程序段1”進(jìn)行編譯;如果沒(méi)有定義標(biāo)識(shí)符,則編譯“程序段2”。一般不使用#else及后面的“程序2”。
而#ifndef的意義與#ifdef相反,其格式如下:
#ifndef 標(biāo)識(shí)符
    程序段 1

#else

    程序段 2

#endif

其意義是:如果未定義標(biāo)識(shí)符,則編譯“程序段1”;否則編譯“程序段2”。
 


5.3使用#defined和#undef
 
與#ifdef類(lèi)似的,可以在#if命令中使用define來(lái)判斷是否已定義指定的標(biāo)識(shí)符。例如:
#if defined 標(biāo)識(shí)符
程序段 1  

#endif

與下面的標(biāo)示方式意義相同。
#ifdef 標(biāo)識(shí)符
    程序段 1

#endif

也可使用邏輯運(yùn)算符,對(duì)defined取反。例如:
#if ! define 標(biāo)識(shí)符
    程序段 1

#endif

與下面的標(biāo)示方式意義相同。
#ifndef 標(biāo)識(shí)符
    程序段 1

#endif

在#ifdef和#ifndef命令后面的標(biāo)識(shí)符是使用#define進(jìn)行定義的。在程序中,還可以使用#undef取消對(duì)標(biāo)識(shí)符的定義,其形式為:
#undef 標(biāo)識(shí)符
Eg:

#define MAX 100

……

#undef MAX

在以上代碼中,首先使用#define定義標(biāo)識(shí)符MAX,經(jīng)過(guò)一段程序代碼后,又可以使用#undef取消已定義的標(biāo)識(shí)符。使用#undef命令后,再使用#ifdef max,將不會(huì)編譯后的源代碼,因?yàn)榇藭r(shí)標(biāo)識(shí)符MAX已經(jīng)被取消定義了。

 


六.其他預(yù)處理命令
 
 6.1.預(yù)定義的宏名
 
       ANSI C標(biāo)準(zhǔn)預(yù)定義了五個(gè)宏名,每個(gè)宏名的前后均有兩個(gè)下畫(huà)線,避免與程序員定義相同的宏名(一般都不會(huì)定義前后有兩個(gè)下劃線的宏)。這5個(gè)宏名如下:
●  __DATE__:當(dāng)前源程序的創(chuàng)建日期。
●  __FILE__:當(dāng)前源程序的文件名稱(chēng)(包括盤(pán)符和路徑)。
●  __LINE__:當(dāng)前被編譯代碼的行號(hào)。
●  __STDC__:返回編譯器是否位標(biāo)準(zhǔn)C,若其值為1表示符合標(biāo)準(zhǔn)C,否則不是標(biāo)準(zhǔn)C.

● __TIME__:當(dāng)前源程序的創(chuàng)建時(shí)間。
Eg:

#include<stdio.h>

 

int main()

{

   int j;

   printf("日期:%s\n",__DATE__);

   printf("時(shí)間:%s\n",__TIME__};

   printf("文件名:%s\n",__FILE__);

   printf("這是第%d行代碼\n",__LINE__);

   printf("本編譯器%s標(biāo)準(zhǔn)C\n",(__STD__)?"符合":"不符合");
   return 0;

}

 


6.2.重置行號(hào)和文件名命令------------#line
 
使用__LINE__預(yù)定義宏名賑災(zāi)編譯的程序行號(hào)。使用#line命令可改變預(yù)定義宏__LINE__與__FILE__的內(nèi)容,該命令的基本形如下:
 #line number[“filename”]

其中的數(shù)字為一個(gè)正整數(shù),可選的文件名為有效文件標(biāo)識(shí)符。行號(hào)為源代碼中當(dāng)前行號(hào),文件名為源文件的名字。命令為#line主要用于調(diào)試以及其他特殊應(yīng)用。
Eg:

1:#include<stdio.h>

2:#include<stdlib.h>

 

4:#line 1000

 

6:int main()

7:{

8:    printf("當(dāng)前行號(hào):%d\n",__LINE__);

9:    return 0;

10:}

在以上程序中,在第4行中使用#line定義的行號(hào)為從1000開(kāi)始(不包括#line這行)。所以第5行的編號(hào)將為1000,第6行為1001,第7行為1002,第8行為1003.

 


6.3.修改編譯器設(shè)置命令 ------------#pragma
 

命令#pragma 為實(shí)現(xiàn)時(shí)定義的命令,它允許向編譯程序傳送各種指令。

#pragma的作用是設(shè)定編譯器的狀態(tài)或者是指示編譯器完成一些特定的動(dòng)作。#pragma指令對(duì)每個(gè)編譯器給出了一個(gè)方法,在保持與CC++語(yǔ)言完全兼容的情況下,給出主機(jī)或操作系統(tǒng)專(zhuān)有的特征。依據(jù)定義,編譯指示是機(jī)器或操作系統(tǒng)專(zhuān)有的,且對(duì)于每個(gè)編譯器都是不同的。
其格式一般為: #Pragma Para
message 
參數(shù)。

 Message 參數(shù)能夠在編譯信息輸出窗口中輸出相應(yīng)的信息,這對(duì)于源代碼信息的控制是非常重要的。其使用方法為:
#pragma message(“
消息文本”)
當(dāng)編譯器遇到這條指令時(shí)就在編譯輸出窗口中將消息文本打印出來(lái)。
當(dāng)我們?cè)诔绦蛑卸x了許多宏來(lái)控制源代碼版本的時(shí)候,我們自己有可能都會(huì)忘記有沒(méi)有正確的設(shè)置這些宏,此時(shí)我們可以用這條指令在編譯的時(shí)候就進(jìn)行檢查。假設(shè)我們希望判斷自己有沒(méi)有在源代碼的什么地方定義了_X86這個(gè)宏可以用下面的方法
#ifdef _X86
#pragma message(“_X86 macro activated!”)
#endif
當(dāng)我們定義了_X86這個(gè)宏以后,應(yīng)用程序在編譯時(shí)就會(huì)在編譯輸出窗口里顯示“_
X86 macro activated!”
。我們就不會(huì)因?yàn)椴挥浀米约憾x的一些特定的宏而抓耳撓腮了。

 code_seg 
參數(shù)。

格式如:
#pragma code_seg( ["section-name"[,"section-class"] ] )
能夠設(shè)置程序中函數(shù)代碼存放的代碼段,當(dāng)我們開(kāi)發(fā)驅(qū)動(dòng)程序的時(shí)候就會(huì)使用到它。

#pragma once (
比較常用)
只要在頭文件的最開(kāi)始加入這條指令就能夠保證頭文件被編譯一次。這條指令實(shí)際上在VC6中就已經(jīng)有了,但是考慮到兼容性并沒(méi)有太多的使用它。

4 #pragma hdrstop

表示預(yù)編譯頭文件到此為止,后面的頭文件不進(jìn)行預(yù)編譯。BCB可以預(yù)編譯頭文件以加快鏈接的速度,但如果所有頭文件都進(jìn)行預(yù)編譯又可能占太多磁盤(pán)空間,所以使用這個(gè)選項(xiàng)排除一些頭文件。
有時(shí)單元之間有依賴(lài)關(guān)系,比如單元A依賴(lài)單元B,所以單元B要先于單元A編譯。你可以用#pragma startup指定編譯優(yōu)先級(jí),如果使用了#pragma package(smart_init) ,BCB就會(huì)根據(jù)優(yōu)先級(jí)的大小先后編譯。

5 #pragma resource "*.dfm"

表示把*.dfm文件中的資源加入工程。*.dfm中包括窗體外觀的定義。

6 #pragma warning( disable : 4507 34; once : 4385; error : 164 )

等價(jià)于:
#pragma warning(disable:4507 34) /* 
不顯示450734號(hào)警告信息。如果編譯時(shí)總是出現(xiàn)4507號(hào)警告和34號(hào)警告,  而認(rèn)為肯定不會(huì)有錯(cuò)誤,可以使用這條指令。*/
#pragma warning(once:4385) // 4385
號(hào)警告信息僅報(bào)告一次
#pragma warning(error:164) // 
164號(hào)警告信息作為一個(gè)錯(cuò)誤。
同時(shí)這個(gè)pragma warning 也支持如下格式:
#pragma warning( push [ ,n ] )
#pragma warning( pop )
這里n代表一個(gè)警告等級(jí)(1---4)。
#pragma warning( push )
保存所有警告信息的現(xiàn)有的警告狀態(tài)。
#pragma warning( push, n)
保存所有警告信息的現(xiàn)有的警告狀態(tài),并且把全局警告等級(jí)設(shè)定為n。
#pragma warning( pop )
向棧中彈出最后一個(gè)警告信息,在入棧和出棧之間所作的一切改動(dòng)取消。例如:
#pragma warning( push )
#pragma warning( disable : 4705 )
#pragma warning( disable : 4706 )
#pragma warning( disable : 4707 )
//.......
#pragma warning( pop )
在這段代碼的最后,重新保存所有的警告信息(包括4705,47064707)

7 pragma comment(...)
該指令將一個(gè)注釋記錄放入一個(gè)對(duì)象文件或可執(zhí)行文件中。
常用的lib關(guān)鍵字,可以幫我們連入一個(gè)庫(kù)文件。 

8 progma pack
n

指定結(jié)構(gòu)體對(duì)齊方式。#pragma pack(n)來(lái)設(shè)定變量以n字節(jié)對(duì)齊方式。

字節(jié)對(duì)齊就是說(shuō)變量存放的起始地址的偏移量有兩種情況:

第一、如果n大于等于該變量所占用的字節(jié)數(shù),那么偏移量必須滿(mǎn)足默認(rèn)的對(duì)齊方式,

第二、如果n小于該變量的類(lèi)型所占用的字節(jié)數(shù),那么偏移量為n的倍數(shù),不用滿(mǎn)足默認(rèn)的對(duì)齊方式。

結(jié)構(gòu)的總大小也有個(gè)約束條件,分下面兩種情況:如果n大于所有成員變量類(lèi)型所占用的字節(jié)數(shù),那么結(jié)構(gòu)的總大小必須為占用空間最大的變量占用的空間數(shù)的倍數(shù); 否則必須為n的倍數(shù)。

下面舉例說(shuō)明其用法。

#pragma pack(push) //保存對(duì)齊狀態(tài)
#pragma pack(4)//
設(shè)定為4字節(jié)對(duì)齊
struct test
{
char m1;
double m4;
int m3;
};
#pragma pack(pop)//
恢復(fù)對(duì)齊狀態(tài)

為測(cè)試該功能,可以使用sizeof()測(cè)試結(jié)構(gòu)體的長(zhǎng)度

 


6.4.產(chǎn)生錯(cuò)誤信息命令 ------------#error
 
#error命令強(qiáng)制編譯器停止編譯,并輸出一個(gè)錯(cuò)誤信息,主要用于程序調(diào)試。其使用如下:
#error 信息錯(cuò)誤
注意,錯(cuò)誤信息不用雙括號(hào)括起來(lái)。當(dāng)遇到#error命令時(shí),錯(cuò)誤信息將顯示出來(lái)。
例如,以下編譯預(yù)處理器命令判斷預(yù)定義宏__STDC__,如果其值不為1,則顯示一個(gè)錯(cuò)誤信息,提示程序員該編譯器不支持ANSI C標(biāo)準(zhǔn)。
#if __STDC__!=1

   #error NOT ANSI C

    #endif

 


七.內(nèi)聯(lián)函數(shù)
 
在使用#define定義帶參數(shù)宏時(shí),在調(diào)用函數(shù)時(shí),一般需要增加系統(tǒng)的開(kāi)銷(xiāo),如參數(shù)傳遞,跳轉(zhuǎn)控制,返回結(jié)果等額外操作需要系統(tǒng)內(nèi)存和執(zhí)行時(shí)間。而使用帶參數(shù)宏時(shí),通過(guò)宏替換可再編譯前將函數(shù)代碼展開(kāi)導(dǎo)源代碼中,使編譯后的目標(biāo)文件含有多段重復(fù)的代碼。這樣做,會(huì)增加程序的代碼量,都可以減少執(zhí)行時(shí)間。
在C99標(biāo)準(zhǔn)鐘,還提供另外一種解決方法:使用內(nèi)聯(lián)函數(shù)。
在程序編譯時(shí),編譯器將程序中出現(xiàn)的內(nèi)聯(lián)函數(shù)的調(diào)用表達(dá)式用內(nèi)聯(lián)函數(shù)的函數(shù)體來(lái)進(jìn)行替代。顯然,這種做法不會(huì)產(chǎn)生轉(zhuǎn)去轉(zhuǎn)回得問(wèn)題。都是由于在編譯時(shí)將函數(shù)體中的代碼被替代到程序中,因此會(huì)增加目標(biāo)代碼量,進(jìn)而增加空間的開(kāi)銷(xiāo),而在時(shí)間開(kāi)銷(xiāo)上不像函數(shù)調(diào)用時(shí)那么大,可見(jiàn)它是以增加目標(biāo)代碼為代碼來(lái)?yè)Q取時(shí)間的節(jié)省。
定義內(nèi)聯(lián)函數(shù)的方法很簡(jiǎn)單,只要在定義函數(shù)頭的前面加上關(guān)鍵字inline即可。內(nèi)聯(lián)函數(shù)的定義與一般函數(shù)一樣。例如,定于一個(gè)兩個(gè)整數(shù)相加的函數(shù):
#include<stdio.h>

#include<stdlib.h>

 

inline int add(int x,int y);

 

inline int add(int x,int y)

{

   return x+y;

}

 

int main()

{

   int i,j,k;

   printf("請(qǐng)輸入兩個(gè)整數(shù)的值:\n");

   scanf("%d %d",&i,&j);

   k=add(i,j);

   printf("k=%d\n",k);

   return 0;

}

在程序中,調(diào)用函數(shù)add時(shí),該函數(shù)在編譯時(shí)會(huì)將以上代碼復(fù)制過(guò)來(lái),而不是像一般函數(shù)那樣是運(yùn)行時(shí)被調(diào)用。
內(nèi)聯(lián)函數(shù)具有一般函數(shù)的特性,它與一般函數(shù)所不同之處在于函數(shù)調(diào)用的處理。一般函數(shù)進(jìn)行調(diào)用時(shí),要講程序執(zhí)行權(quán)轉(zhuǎn)導(dǎo)被調(diào)函數(shù)中,然后再返回到調(diào)用到它的函數(shù)中;而內(nèi)聯(lián)函數(shù)在調(diào)用時(shí),是將調(diào)用表達(dá)式用內(nèi)聯(lián)函數(shù)體來(lái)替換。在使用內(nèi)聯(lián)函數(shù)時(shí),應(yīng)該注意如下幾點(diǎn):
●    在內(nèi)聯(lián)函數(shù)內(nèi)部允許用循環(huán)語(yǔ)句和開(kāi)關(guān)語(yǔ)句。
●    內(nèi)聯(lián)函數(shù)的定義必須出現(xiàn)在內(nèi)聯(lián)函數(shù)第一次被調(diào)用之前。
其實(shí),在程序中聲明一個(gè)函數(shù)為內(nèi)聯(lián)時(shí),編譯以后這個(gè)函數(shù)不一定是內(nèi)聯(lián)的,
即程序只是建議編譯器使用內(nèi)聯(lián)函數(shù),但是編譯器會(huì)根據(jù)函數(shù)情況決定是否使用內(nèi)聯(lián),所以如果編寫(xiě)的內(nèi)聯(lián)函數(shù)中出現(xiàn)循環(huán)或者開(kāi)關(guān)語(yǔ)句,程序也不會(huì)提示出錯(cuò),但那個(gè)函數(shù)已經(jīng)不是內(nèi)聯(lián)函數(shù)了。
    一般都是講一個(gè)小型函數(shù)作為內(nèi)聯(lián)函數(shù)。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶(hù)發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
C語(yǔ)言入門(mén)之C 預(yù)處理器
C語(yǔ)言預(yù)處理命令分類(lèi)和工作原理
長(zhǎng)文花了兩天時(shí)間整理了STM32中的一些C語(yǔ)言知識(shí)點(diǎn)
#pragma 預(yù)處理指令詳解 - roy的學(xué)習(xí)筆記
【C語(yǔ)言講義更新】C語(yǔ)言中的其它預(yù)處理命令
編譯預(yù)處理指令【精】
更多類(lèi)似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服