C和C語言中編譯預處理大全lineerrorpragma_第1頁
C和C語言中編譯預處理大全lineerrorpragma_第2頁
C和C語言中編譯預處理大全lineerrorpragma_第3頁
C和C語言中編譯預處理大全lineerrorpragma_第4頁
C和C語言中編譯預處理大全lineerrorpragma_第5頁
已閱讀5頁,還剩9頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、C語言與C+中中編譯預處理的學習記錄:首先三種形式的命令:宏定義,文件包含,條件編譯命令。1、宏定義主要是:#define,#undef如下:#define PI 3.1415926 /*不帶參數的宏定義*/#define Max(a,b) a>b?a:b /*帶參數的宏定義*/說明:宏定義在C語言與C+語言中是相通的。下面舉例說明定義宏FAILED用于檢測數據的正確性。#define的應用:#define FAILED(Status) (Status)<0)#include "stdio.h"void main()int d;printf ("Ple

2、ase input a integer number(n>0)n");doscanf("%d" ,&d);while(FAILED(d); 其中while(FAILED(d)在編譯之前被無條件替換為while(d<0)。 宏定義和調用在形式與函數比較相似,但是原理是不同。#undef的應用:#include "stdio.h"void Test();int main(int argc, char* argv)#define CONST_NAME1 "CONST_NAME1"printf("%sn

3、",CONST_NAME1);#undef CONST_NAME1printf("%sn",CONST_NAME1); /*錯誤,CONST_NAME1的定義已經取消*/#define CONST_NAME2 "CONST_NAME2"printf("%sn",CONST_NAME2);printf("%sn",CONST_NAME2);return 0;void Test()printf("%sn",CONST_NAME2);在程序的編譯的時候,系統提示如下信息error C2065

4、: 'CONST_NAME1' : undeclared identifier出現上述編譯錯誤的原因是,在第二次應用符號常量CONST_NAME1時,此符號常量已經被取消定義。2、文件包含:#include <文件名> ,這種屬于標準方式,用于編譯系統指定的文件。#include “文件名”,這種屬于用戶方式,查找用戶當前工作的文件夾中的文件,如果不存在則再按照標準方式查詢。3、條件編譯(常見的三種形式):第一種形式:#if defined(或者是ifdef)<標識符><程序段1>#else<程序段2>#endif第二種形式:#i

5、f !defined(或者是ifndef)<標識符><程序段1>#else<程序段2>#endif第三種形式常用與C+編譯器中。#ifdef #elif #elif #else #endif4、其他條件編譯命令:#error:語法格式如下:#error token-sequence其主要的作用是在編譯的時候輸出編譯錯誤信息token-sequence,從方便程序員檢查程序中出現的錯誤。例如下面的程序#include "stdio.h"int main(int argc, char* argv)#define CONST_NAME1 &qu

6、ot;CONST_NAME1" printf("%sn",CONST_NAME1);#undef CONST_NAME1#ifndef CONST_NAME1#error No defined Constant Symbol CONST_NAME1#endif#define CONST_NAME2 "CONST_NAME2" printf("%sn",CONST_NAME2); printf("%sn",CONST_NAME2); return 0;在編譯的時候輸出如編譯信息fatal error C11

7、89: #error : No defined Constant Symbol CONST_NAME1# pragma在編寫程序的時候,我們經常要用到#pragma 指令來設定編譯器的狀態或者是指示編譯器完成一些特定的動作. 下面介紹了一下該指令的一些常用參數,希望對大家有所幫助!一般格式:#pragma para 一、 message 參數。 message 它能夠在編譯信息輸出窗 口中輸出相應的信息,這對于源代碼信息的控制是非常重要的。其使用方法為: #pragma message(“消息文本”) 當編譯器遇到這條指令時就在編譯輸出窗口中將消息文本打印出來。 當我們在程序中定義了許多宏來控

8、制源代碼版本的時候,我們自己有可能都會忘記有沒有正確的設置這些宏,此時我們可以用這條 指令在編譯的時候就進行檢查。假設我們希望判斷自己有沒有在源代碼的什么地方定義了_X86這個宏可以用下面的方法 #ifdef _X86 #pragma message(“_X86 macro activated!”) #endif 當我們定義了_X86這個宏以后,應用程序在編譯時就會在編譯輸出窗口里顯示“_ X86 macro activated!”。我們就不會因為不記得自己定義的一些特定的宏而抓耳撓腮了 二、 另一個使用得比較多的#pragma參數是code_seg。格式如: #pragma code_seg

9、( push | pop, identifier, "segment-name" , "segment-class" ) 該指令用來指定函數在.obj文件中存放的節,觀察OBJ文件可以使用VC自帶的dumpbin命令行程序,函數在.obj文件中默認的存放節 為.text節 如果code_seg沒有帶參數的話,則函數存放在.text節中 push (可選參數) 將一個記錄放到內部編譯器的堆棧中,可選參數可以為一個標識符或者節名 pop(可選參數) 將一個記錄從堆棧頂端彈出,該記錄可以為一個標識符或者節名 identifier (可選參數) 當使用push指

10、令時,為壓入堆棧的記錄指派的一個標識符,當該標識符被刪除的時候和其相關的堆棧中的記錄將被彈出堆棧 "segment-name" (可選參數) 表示函數存放的節名 例如: /默認情況下,函數被存放在.text節中 void func1() / stored in .text /將函數存放在.my_data1節中 #pragma code_seg(".my_data1") void func2() / stored in my_data1 /r1為標識符,將函數放入.my_data2節中 #pragma code_seg(push, r1, ".m

11、y_data2") void func3() / stored in my_data2 int main() 三、 #pragma once (比較常用) 這是一個比較常用的指令,只要在頭文件的最開始加入這條指令就能夠保證頭文件被編譯一次 四、 #pragma hdrstop表示預編譯頭文件到此為止,后面的頭文件不進行預編譯。 BCB可以預編譯頭文件以加快鏈接的速度,但如果所有頭文件都進行預編譯又可能占太多磁盤空間,所以使用這個選項排除一些頭文件。 有時單元之間有依賴關系,比如單元A依賴單元B,所以單元B要先于單元A編譯。你可以用#pragma startup指定編譯優先級, 如果使

12、用了#pragma package(smart_init) ,BCB就會根據優先級的大小先后編譯。 五、 #pragma warning指令 該指令允許有選擇性的修改編譯器的警告消息的行為 指令格式如下: #pragma warning( warning-specifier : warning-number-list ; warning-specifier : warning-number-list. #pragma warning( push ,n ) #pragma warning( pop ) 主要用到的警告表示有如下幾個: once:只顯示一次(警告/錯誤等)消息 default:重置

13、編譯器的警告行為到默認狀態 1,2,3,4:四個警告級別 disable:禁止指定的警告信息 error:將指定的警告信息作為錯誤報告 如果大家對上面的解釋不是很理解,可以參考一下下面的例子及說明 #pragma warning( disable : 4507 34; once : 4385; error : 164 ) 等價于: #pragma warning(disable:4507 34) / 不顯示4507和34號警告信息 #pragma warning(once:4385) / 4385號警告信息僅報告一次 #pragma warning(error:164) / 把164號警告信息

14、作為一個錯誤。 同時這個pragma warning 也支持如下格式: #pragma warning( push ,n ) #pragma warning( pop ) 這里n代表一個警告等級(1-4)。 #pragma warning( push )保存所有警告信息的現有的警告狀態。 #pragma warning( push, n)保存所有警告信息的現有的警告狀態,并且把全局警告 等級設定為n。 #pragma warning( pop )向棧中彈出最后一個警告信息,在入棧和出棧之間所作的 一切改動取消。例如: #pragma warning( push ) #pragma warnin

15、g( disable : 4705 ) #pragma warning( disable : 4706 ) #pragma warning( disable : 4707 ) #pragma warning( pop ) 在這段代碼的最后,重新保存所有的警告信息(包括4705,4706和4707) 在使用標準C+進行編程的時候經常會得到很多的警告信息,而這些警告信息都是不必要的提示, 所以我們可以使用#pragma warning(disable:4786)來禁止該類型的警告 在vc中使用ADO的時候也會得到不必要的警告信息,這個時候我們可以通過 #pragma warning(disable

16、:4146)來消除該類型的警告信息 六、 pragma comment(.) 該指令的格式為 #pragma comment( "comment-type" , commentstring ) 該指令將一個注釋記錄放入一個對象文件或可執行文件中, comment-type(注釋類型):可以指定為五種預定義的標識符的其中一種 五種預定義的標識符為: compiler:將編譯器的版本號和名稱放入目標文件中,本條注釋記錄將被編譯器忽略 如果你為該記錄類型提供了commentstring參數,編譯器將會產生一個警告 例如:#pragma comment( compiler ) ex

17、estr:將commentstring參數放入目標文件中,在鏈接的時候這個字符串將被放入到可執行文件中, 當操作系統加載可執行文件的時候,該參數字符串不會被加載到內存中.但是,該字符串可以被 dumpbin之類的程序查找出并打印出來,你可以用這個標識符將版本號碼之類的信息嵌入到可 執行文件中! lib:這是一個非常常用的關鍵字,用來將一個庫文件鏈接到目標文件中 常用的lib關鍵字,可以幫我們連入一個庫文件。 例如: #pragma comment(lib, "user32.lib") 該指令用來將user32.lib庫文件加入到本工程中 linker:將一個鏈接選項放入目標

18、文件中,你可以使用這個指令來代替由命令行傳入的或者在開發環境中 設置的鏈接選項,你可以指定/include選項來強制包含某個對象,例如: #pragma comment(linker, "/include:_mySymbol") 你可以在程序中設置下列鏈接選項 /DEFAULTLIB /EXPORT /INCLUDE /MERGE /SECTION 這些選項在這里就不一一說明了,詳細信息請看msdn! user:將一般的注釋信息放入目標文件中commentstring參數包含注釋的文本信息,這個注釋記錄將被鏈接器忽略 例如: #pragma comment( user, &

19、quot;Compiled on " _DATE_ " at " _TIME_ ) 補充一個 #pragma pack(n) 控制對齊 如 #pragma pack(push) #pragma pack(1) struct s_1 char szname1; int a; ; #pragma pack(pop) struct s_2 char szname1; int a; ; 則 printf("s_1 size : %dn", sizeof(struct s_1); printf("s_2 size : %dn", si

20、zeof(struct s_2); 得到5,8。七、 pragma的用法 pragma是一個C語言中的預處理指令,它的作用是設定編譯器的狀態或者是指示編譯器完成一些特定的動作。依據定義,編譯指示是機器或操作系統專有的,且對于每個編譯器都是不同的。其格式一般為: #pragma Para其中Para 為參數,下面來看一些常用的參數。(1) message 參數。 Message 參數是我最喜歡的一個參數,它能夠在編譯信息輸出窗口中輸出相應的信息,這對于源代碼信息的控制是非常重要的。其使用方法為:#Pragma message(“消息文本”)當編譯器遇到這條指令時就在編譯輸出窗口中將消息文本打印出

21、來。當我們在程序中定義了許多宏來控制源代碼版本的時候,我們自己有可能都會忘記有沒有正確的設置這些宏,此時我們可以用這條指令在編譯的時候就進行檢查。假設我們希望判斷自己有沒有在源代碼的什么地方定義了_X86這個宏可以用下面的方法#ifdef _X86#Pragma message(“_X86 macro activated!”)#endif當我們定義了_X86這個宏以后,應用程序在編譯時就會在編譯輸出窗口里顯示“_X86 macro activated!”。我們就不會因為不記得自己定義的一些特定的宏而抓耳撓腮了。(2) 另一個使用得比較多的pragma參數是code_seg。格式如:#pragm

22、a code_seg( "section-name","section-class" )它能夠設置程序中函數代碼存放的代碼段,當我們開發驅動程序的時候就會使用到它。(3) #pragma once (比較常用)只要在頭文件的最開始加入這條指令就能夠保證頭文件被編譯一次,這條指令實際上在VC6中就已經有了,但是考慮到兼容性并沒有太多的使用它。(4) #pragma hdrstop表示預編譯頭文件到此為止,后面的頭文件不進行預編譯。BCB可以預編譯頭文件以加快鏈接的速度,但如果所有頭文件都進行預編譯又可能占太多磁盤空間,所以使用這個選項排除一些頭文件。 有時

23、單元之間有依賴關系,比如單元A依賴單元B,所以單元B要先于單元A編譯。你可以用#pragma startup指定編譯優先級,如果使用了#pragma package(smart_init) ,BCB就會根據優先級的大小先后編譯。 (5) #pragma resource "*.dfm"表示把*.dfm文件中的資源加入工程。*.dfm中包括窗體外觀的定義。 (6) #pragma warning( disable : 4507 34; once : 4385; error : 164 )等價于:#pragma warning(disable:4507 34) / 不顯示450

24、7和34號警告信息#pragma warning(once:4385) / 4385號警告信息僅報告一次#pragma warning(error:164) / 把164號警告信息作為一個錯誤。同時這個pragma warning 也支持如下格式:#pragma warning( push ,n )#pragma warning( pop )這里n代表一個警告等級(1-4)。#pragma warning( push )保存所有警告信息的現有的警告狀態。#pragma warning( push, n)保存所有警告信息的現有的警告狀態,并且把全局警告等級設定為n。 #pragma warnin

25、g( pop )向棧中彈出最后一個警告信息,在入棧和出棧之間所作的一切改動取消。例如:#pragma warning( push )#pragma warning( disable : 4705 )#pragma warning( disable : 4706 )#pragma warning( disable : 4707 )/.#pragma warning( pop ) 在這段代碼的最后,重新保存所有的警告信息(包括4705,4706和4707)。(7) pragma comment(.)該指令將一個注釋記錄放入一個對象文件或可執行文件中。常用的lib關鍵字,可以幫我們連入一個庫文件。(

26、8) progma pack(n)指定結構體對齊方式!#pragma pack(n)來設定變量以n字節對齊方式。n字節對齊就是說變量存放的起始地址的偏移量有兩種情況:第一、如果n大于等于該變量所占用的字節數,那么偏 移量必須滿足默認的對齊方式,第二、如果n小于該變量的類型所占用的字節數,那么偏移量為n的倍數,不用滿足默認的對齊方式。結構的總大小也有個約束條 件,分下面兩種情況:如果n大于所有成員變量類型所占用的字節數,那么結構的總大小必須為占用空間最大的變量占用的空間數的倍數; 否則必須為n的倍數。下面舉例說明其用法。 #pragma pack(push) /保存對齊狀態#pragma pac

27、k(4)/設定為4字節對齊struct testchar m1;double m4;int m3; #pragma pack(pop)/恢復對齊狀態 為測試該功能,可以使用sizeof()測試結構體的長度!#line此命令主要是為強制編譯器按指定的行號,開始對源程序的代碼重新編號,在調試的時候,可以按此規定輸出錯誤代碼的準確位置。形式1語法格式如下:# line constant “filename”:其作用是使得其后的源代碼從指定的行號constant重新開始編號,并將當前文件的名命名為filename。例如下面的程序如下:#include "stdio.h"void Test();#line 10 "Hello.c"int main(int argc, char* argv)#define CONST_NAME1 "CONST_NAME1"printf("%sn",CONST_NAME1);#undef CONST_NAME1printf("%sn",CONST_NAME1);#define CONST_NAME2 "CONST_NAME2"printf("%sn",CONST_NAME2);pr

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論