以預編譯頭文件為Stdafx.h為例:
Qt Creator中很簡單,只需在.pro文件中加入一行PRECOMPILED_HEADER = stdafx.h
VS2008在工程中在Stdafx.h文件上右鍵propertis-Configuration Properties-C/C++-Precompiled Headers-Create/Use Precompiled Header中選擇Create Precompiled Header(/y).
有一點注意的是,在工程Generated Filed中的moc相關文件也需要選上Use Precompiled Header (/Yu).
② C語言提供的預編譯處理命令主要有哪三種
1.宏定義:用一個指定的標識符(即名字)來代表一個字元串,如:用PI代表3.1415926,#define PI 3.1415926
2.文件包含:指一個源文件可以將另外一個源文件的全部內容包含進來,#include<文件名>
3.條件編譯:對一部分內容指定編譯的條件,即滿足一定的條件才編譯,主要有:
(1)#ifdef標識符
程序段1
#eles
程序段2
#endif
(2)#ifndef標識符
程序段1
#eles
程序段2
#endif
(3))#if標識符
程序段1
#eles
程序段2
#endif
③ 關於C語言預處理命令
第一句有問題。
比如
#ifndef WIN32
#endif printf("OK\n");
在這里,這個printf就不會被執行。也就是說, 一行中, 只能有一條預處理指令,
當編譯的預處理階段, 編譯器識別了一條完整的預處理指令後,後面的所有東西他都不要了。
對於第二句,在函數里,我們是可以使用預處理指令的。
比如
void fun(void)
{
#ifdef WIN32
... // 對於windows系統環境的操作
#else
... // 對於windows以外的系統環境的操作
#endif /* WIN32 */
...
}
樓上的同學, 你是在哪兒本書上看的? 介紹一下唄
④ 求C語言中預編譯命令表
1 宏定義即是字元串替換。宏分為無參宏和含參宏。定義宏的位置可以在函數外部也可以在函數內部(vc++ 2008 測試通過)。宏的作用域是從定義處到取消定義命令[#undef 宏名]之間的部分,若無顯式的#undef命令則默認到文件結束。可以使用defined命令可以判斷宏是否被定義#if defined X (=#ifdef X),#if !defined X (= ifndef X)。 定義含參宏格式如#define SQ(y) ((y)*(y)),其中參數為y,宏得到的是y平方。為了保證宏替換的正確性,多加了3個括弧。但這樣的保證也是有限的,它要求y的值不能在(y)內改變,如把y換成i++將得不到期望的結果。 宏調用(實際上是宏替換)不用考慮形參的類型,這帶來一定的好處。如求兩個數最大值的宏#define MAX(a,b) (a>b)?a:b,實參可以是int,double等。宏定義可以包括多個語句,如#define CHANGE(X1,X2,X3,X4) X1 += 1;X2 += 2; X3 += 3; X4 +=4; 2 文件包含命令#include的功能是把指定的文件插入該命令行位置取代該命令行,從而把指定的文件和當前的源程序文件連成一個源文件。 源代碼分布於多個文件時,建議使用調用文件+頭文件+實現文件的模式。頭文件中包含要用到的函數說明,類型定義,宏定義,常數值等。具體的實現放在實現文件中。在調用文件和實現文件中都包含該頭文件即可。為了避免重復包含頭文件,可在頭文件中使用#ifndef [頭文件標示符(如X_Header等等)] + 頭文件內容 + #endif模式。 3 條件編譯命令可以按不同的條件去編譯不同的程序部分,因而產生不同的目標代碼文件。 這對於程序的移植和調試很有用。條件編譯有三種形式,下面分別介紹:
第一種形式根據有無對應宏定義選擇編譯程序段:
#ifdef 標識符 // 或 #ifndef 標示符
程序段1
#else
程序段2
#endif 第二種形式根據常量表達式值選擇編譯,值為非0執行if段。#if 常量表達式
程序段1
#else
程序段2
#endif
這里一定要是常量表達式,一般為宏。若是表達式包含變數則編譯器只能隨便猜一個了。 第三種形式含有#elif,看個例子吧#define ABC 3
void main(){#if ABC>0
int a=1;
printf("%d/n",a);
#elif ABC<0
int b=-1;
printf("%d/n",b);
#else
int c=0;
printf("%d/n",c);
#endif
} 其餘的預編譯命令如下,這里就不研究它們了。#line 標志該語句所在的行號
# 將宏參數替代為以參數值為內容的字元竄常量
## 將兩個相鄰的標記(token)連接為一個單獨的標記
#pragma 說明編譯器信息#warning 顯示編譯警告信息
#error 顯示編譯錯誤信息
⑤ 這個預處理命令是怎麼回事
防止頭文件被多次編譯
⑥ c++的編譯預處理命令在哪添加
這個關鍵看你了。大部分程序都是放在最前面,和頭文件並列。其實你理解編譯預處理這個詞,不難理解出:它是在編譯的時候就存在內存中了,要用時直接引用,因為它最終還是要被編譯,不關位置的關系,而頭文件就必須在前面,因為後面的程序會用到這個頭文件的函數等,如cout等,意思就是說要聲明並進行調用。你這個問題我以前驗證過。自己大膽驗證吧,不要怕電腦出問題,或者只要結果。
⑦ 一般地,調用標准字元或格式輸入輸出庫函數時,文件開頭應有以下預編譯命令:___
編譯,編譯程序讀取源程序(字元流),對之進行詞法和語法的分析,將高級語言指令轉換為功能等效的匯編代碼,再由匯編程序轉換為機器語言,並且按照操作系統對可執行文件格式的要求鏈接生成可執行程序。
⑧ C++編程:哪裡有比較全面的預編譯命令學習資料
在msdn搜索
C/C++ Preprocessor Reference
或者訪問
http://msdn2.microsoft.com/zh-cn/library/y4skk93w(VS.80).aspx
⑨ 預編譯的編譯指令
預編譯指令指示了在程序正式編譯前就由編譯器進行的操作,可以放在程序中的任何位置。常見的預編譯指令有:
(1)#include 指令
該指令指示編譯器將xxx.xxx文件的全部內容插入此處。若用<>括起文件則在系統的INCLUDE目錄中尋找文件,若用 括起文件則在當前目錄中尋找文件。一般來說,該文件是後綴名為h或cpp的頭文件。
注意:<>不會在當前目錄下搜索頭文件,如果我們不用<>而用把頭文件名擴起,其意義為在先在當前目錄下搜索頭文件,再在系統默認目錄下搜索。
(2)#define指令
該指令有三種用法:
第一種是定義標識,標識有效范圍為整個程序,形如#define XXX,常與#if配合使用;
第二種是定義常數,如#define max 100,則max代表100(這種情況下使用const定義常數更好,原因見注1);
第三種是定義函數,如#define get_max(a, b) ((a)>(b)?(a):(b)) 則以後使用get_max(x,y)就可以得到x和y中較大的數(這種方法存在一些弊病,見注2)。
第四種是定義宏函數,如#define GEN_FUN(type) type max_##type(type a,type b){return a>b?a:b;} ,使用時,用GEN_FUN(int),則此處預編譯後就變成了 max_int(int a,int b){return a>b?a:b;},以後就可以使用max_int(x,y)就可以得到x和y中較大的數.比第三種,增加了類型的說明。
(3)#if、#else和#endif指令
這些指令一般這樣配合使用:
#if defined(標識) //如果定義了標識
要執行的指令
#else
要執行的指令
#endif
在頭文件中為了避免重復調用(比如說兩個頭文件互相包含對方),常採用這樣的結構:
#if !(defined XXX) //XXX為一個在你的程序中唯一的標識符,
//每個頭文件的標識符都不應相同。
//起標識符的常見方法是若頭文件名為abc.h
//則標識為abc_h
#define XXX
真正的內容,如函數聲明之類
#endif
注1:因為:const常量有數據類型,而宏常量沒有數據類型。編譯器可以對前者進行類型安全檢查,而對後者只進行字元替換,沒有類型安全檢查,並且在字元替換時可能會產生意料不到的錯誤(邊際效應)。
注2:例如get_max(a++, b)時,a++會被執行多少次取決於a和b的大小!所以建議還是用內聯函數而不是這種方法提高速度。雖然有這樣的弊病,但這種方法的確非常靈活,因為a和b可以是各種數據類型。
注3:可以查看網路的預處理命令,編排的比較簡明。
⑩ C語言預編譯命令
#include <assert.h> //設定插入點
#include <ctype.h> //字元處理
#include <errno.h> //定義錯誤碼
#include <float.h> //浮點數處理
#include <fstream.h> //文件輸入/輸出
#include <iomanip.h> //參數化輸入/輸出
#include <iostream.h> //數據流輸入/輸出
#include <limits.h> //定義各種數據類型最值常量
#include <locale.h> //定義本地化函數
#include <math.h> //定義數學函數
#include <stdio.h> //定義輸入/輸出函數
#include <stdlib.h> //定義雜項函數及內存分配函數
#include <string.h> //字元串處理
#include <strstrea.h> //基於數組的輸入/輸出
#include <time.h> //定義關於時間的函數
#include <wchar.h> //寬字元處理及輸入/輸出
#include <wctype.h> //寬字元分類
//////////////////////////////////////////////////////////////////////////
標准 C++ (同上的不再注釋)
#include <algorithm> //STL 通用演算法
#include <bitset> //STL 位集容器
#include <cctype>
#include <cerrno>
#include <clocale>
#include <cmath>
#include <complex> //復數類
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque> //STL 雙端隊列容器
#include <exception> //異常處理類
#include <fstream>
#include <functional> //STL 定義運算函數(代替運算符)
#include <limits>
#include <list> //STL 線性列表容器
#include <map> //STL 映射容器
#include <iomanip>
#include <ios> //基本輸入/輸出支持
#include <iosfwd> //輸入/輸出系統使用的前置聲明
#include <iostream>
#include <istream> //基本輸入流
#include <ostream> //基本輸出流
#include <queue> //STL 隊列容器
#include <set> //STL 集合容器
#include <sstream> //基於字元串的流
#include <stack> //STL 堆棧容器
#include <stdexcept> //標准異常類
#include <streambuf> //底層輸入/輸出支持
#include <string> //字元串類
#include <utility> //STL 通用模板類
#include <vector> //STL 動態數組容器
#include <cwchar>
#include <cwctype>
using namespace std;
//////////////////////////////////////////////////////////////////////////
C99 增加
#include <complex.h> //復數處理
#include <fenv.h> //浮點環境
#include <inttypes.h> //整數格式轉換
#include <stdbool.h> //布爾環境
#include <stdint.h> //整型環境
#include <tgmath.h> //通用類型數學宏