1. 編譯和預編譯有什麼區別。
預編譯又稱為預處理,是做些代碼文本的替換工作。
處理#開頭的指令,比如拷貝#include包含的文件代碼,#define宏定義的替換,條件編譯等
就是為編譯做的預備工作的階段
主要處理#開始的預編譯指令
編譯(compilation , compile) 1、利用編譯程序從源語言編寫的源程序產生目標程序的過程。 2、用編譯程序產生目標程序的動作。 編譯就是把高級語言變成計算機可以識別的2進制語言,計算機只認識1和0,編譯程序把人們熟悉的語言換成2進制的。
2. c語言編譯預處理
編譯,編譯程序讀取源程序(字元流),對之進行詞法和語法的分析,將高級語言指令轉換為功能等效的匯編代碼,再由匯編程序轉換為機器語言,並且按照操作系統對可執行文件格式的要求鏈接生成可執行程序。
如果用一張圖來表示:
讀取c源程序,對其中的偽指令(以#開頭的指令)和特殊符號進行處理
[析] 偽指令主要包括以下四個方面
(1)宏定義指令,如#define Name TokenString,#undef等。對於前一個偽指令,預編譯所要做的是將程序中的所有Name用TokenString替換,但作為字元串常量的Name則不被替換。對於後者,則將取消對某個宏的定義,使以後該串的'出現不再被替換。
(2)條件編譯指令,如#ifdef,#ifndef,#else,#elif,#endif,等等。這些偽指令的引入使得程序員可以通過定義不同的宏來決定編譯程序對哪些代碼進行處理。預編譯程序將根據有關的文件,將那些不必要的代碼過濾掉
(3)頭文件包含指令,如#include "FileName"或者#include 等。在頭文件中一般用偽指令#define定義了大量的宏(最常見的是字元常量),同時包含有各種外部符號的聲明。採用頭文件的目的主要是為了使某些定義可以供多個不同的C源程序使用。因為在需要用到這些定義的C源程序中,只需加上一條#include語句即可,而不必再在此文件中將這些定義重復一遍。預編譯程序將把頭文件中的定義統統都加入到它所產生的輸出文件中,以供編譯程序對之進行處理。
包含到c源程序中的頭文件可以是系統提供的,這些頭文件一般被放在/usr/include目錄下。在程序中#include它們要使用尖括弧(<>)。另外開發人員也可以定義自己的頭文件,這些文件一般與c源程序放在同一目錄下,此時在#include中要用雙引號("")。
(4)特殊符號,預編譯程序可以識別一些特殊的符號。例如在源程序中出現的LINE標識將被解釋為當前行號(十進制數),FILE則被解釋為當前被編譯的C源程序的名稱。預編譯程序對於在源程序中出現的這些串將用合適的值進行替換。
注意:
預編譯程序所完成的基本上是對源程序的「替代」工作。經過此種替代,生成一個沒有宏定義、沒有條件編譯指令、沒有特殊符號的輸出文件。這個文件的含義同沒有經過預處理的源文件是相同的,但內容有所不同。下一步,此輸出文件將作為編譯程序的輸出而被翻譯成為機器指令。
3. C++中p沒有定義 為什麼編譯能通過
C++的處理機制是分模塊的,用戶自己創建的話,它有一個模塊處理,只預編譯頭文件,可以提高編譯速度,尤其對於大程序。而設計模板的時候,C++就會調用模板處理模塊,那個模塊可能就是默認.h和.cpp在一起的,而且你可以想像一下,如果只編譯.h的話,如果你的程序中使用了模板的某個具體部分,C++還是需要處理模板中.cpp的部分,而這部分沒有被編譯,會出問題的。
也就是說,你編了一個具有公共使用功能的模板,編譯的時候只預編譯了頭文件 .h,但是你的模板是分開的。寫在了.cpp里, 只有調用的時候才會處理模板中.cpp的部分 才會出現錯誤。所以不會報錯 。你換在.h里就好報錯了
4. 編譯命令里有帶預定義宏的命令嗎
DEBUG宏是在編譯時根據編譯的版本是DEBUG還是RELEASE由編譯器臨時插入的。這些類似的宏是根據你對工程所做的設置由編譯器插入的。你也可以自己定義一組宏寫到一個外部文件里,把這個外部文件在工程屬性的命令行里,用@引入進來,這樣就能在外部文件中對編譯進行控制。編譯相關的宏設置很多,編譯器選項的命令也非常多,不同編譯器支持的命令也不一樣,網路一下編譯選項,或者再深入研究一下你的集成開發環境吧,具體我也記不太清了,多搜搜肯定有。
5. 為什麼在編寫程序中使用預定義的宏編譯不通過啊
宏定義只是在程序編譯時編譯器自動替換相應的宏,而const定義的是常量便於進行類型檢查
define是簡單的替換
const ABC value 會進行類型檢查
6. 沒有聲明函數也可以通過編譯
如果該函數聲明的修飾符為public類型的,在main中當然可以直接調用了。public不受調用限制
7. 「C語言的預處理 不能實現宏定義和條件編譯的功能」和「C語言的預處理不能實現宏定義和條件編譯的功能」
這兩句話是一個意思, C語言中的預處理,是可以實現宏定義和條件編譯功能的。比如下面的代碼定義了一個宏S,它的值是」hello world ",可以用printf函數直接列印出來。
#include<stdio.h>
#defineS"helloworld "
intmain()
{
printf(S);
return0;
}
C語言中的預處理也可以實現條件編譯功能,預處理到現在依然存在的一個重要原因就在於此。比如下面的代碼:
#include<stdio.h>
intmain()
{
#ifdef_DEBUG
printf("程序生成的debug版 ");
#else
printf("程序生成的是release版 ");
#endif
return0;
}
8. C/C++ 的預編譯原理是什麼為什麼要用預編譯
為了防止程序在實際應用當中出現錯誤
9. C++如何定義一個預定義變數
C++預定義變數:
1)__LINE__ 和 __FILE__ 變數表示正在處理的當前行和當前文件。__FILE__ 這個變數對於要獲取當前程序的路徑很有用,可以簡單的通過string str(__FILE__ )就可以得到當前程序的路徑。
2)__DATE__ 變數表示當前日期,格式為month/day/year(月/日/年)。
3)__TIME__ 變數描述當前的時間,格式為hour:minute:second(時:分:秒)。
4)_cplusplus 變數只在編譯一個C++程序時定義。
下面通過程序來查看這幾個變數的內容,代碼如下:
int main( int argc, char*argv[])
{
string str1(__FILE__);
string str2(__TIME__);
string str3(__DATE__);
cout<<str1<<endl;
cout<<str2<<endl;
cout<<str3<<endl;
return 0;
}
程序執行結果如下:
10. C語言的預定義
1.使用預定義,可以實現函數的移植。
不管在各個種平台上,都可以實現:
#define TRUE 1
#define FALSE 0
#define long INT
#define int INT //有的機器int與short的長度相同
#define short SHORT
2.使用預定義可以定義一些簡單的函數,且效率很高。因為編譯完成替換
#define MIN(a,b) ((a)<(b)?(a):(b))
3.使用預定義可以防止頭文件重復編譯。
#ifndef _H_HEAD_H_
#define _H_HEAD_H_ aa
.... //相應的頭文件內容
#endif
不好的地方就是:
使用預定義易出錯,且出錯時,難以檢查。