『壹』 簡述將源程序編譯成可執行程序的過程
一個源程序到一個可執行程序的過程:預編譯、編譯、匯編、鏈接。其中,編譯是主要部分,其中又分為六個部分:詞法分析、語法分析、語義分析、中間代碼生成、目標代碼生成和優化。
預編譯:主要處理源代碼文件中的以「#」開頭的預編譯指令。處理規則如下:
1、刪除所有的#define,展開所有的宏定義。
2、處理所有的條件預編譯指令,如「#if」、「#endif」、「#ifdef」、「#elif」和「#else」。
3、處理「#include」預編譯指令,將文件內容替換到它的位置,這個過程是遞歸進行的,文件中包含其他文件。
4、刪除所有的注釋,「//」和「/**/」。
5、保留所有的#pragma 編譯器指令,編譯器需要用到他們,如:#pragma once 是為了防止有文件被重復引用。
6、添加行號和文件標識,便於編譯時編譯器產生調試用的行號信息,和編譯時產生編譯錯誤或警告是能夠顯示行號。
(1)條件預編譯多條件擴展閱讀:
編譯過程中語法分析器只是完成了對表達式語法層面的分析,語義分析器則對表達式是否有意義進行判斷,其分析的語義是靜態語義——在編譯期能分期的語義,相對應的動態語義是在運行期才能確定的語義。
其中,靜態語義通常包括:聲明和類型的匹配,類型的轉換,那麼語義分析就會對這些方面進行檢查,例如將一個int型賦值給int*型時,語義分析程序會發現這個類型不匹配,編譯器就會報錯。
『貳』 C語言中#if #else 有什麼作用
#if是個預編譯指令的田間編譯指令
可以使用條件編譯選擇特定的代碼節進行編譯,而排除其他代碼節。例如,可能需要編寫調試語句來比較同一編程任務的不同方法的速度,或者可能需要本地化用於多種語言的應用程序。條件編譯語句被設計為在編譯時(而不是在運行時)運行。
一般在C++裡面有的,#if這類東西通場會放到程序開頭,方便經常調用的函數,,變數,標示等等,放在函數裡面他就在函數裡面起作用,在函數外面,計算機就不認識他了,呵呵。,。
他們是程序編譯的時,控制器好分配資源,通常我們用的是#ifdef 查看前面或是別人如果定義了一個宏 定義了,,那就跳過,,沒定義#ifndef 那麼then #def 定義 用#endif是搭配#if 是結束這些宏定義語句用的
有#是預編譯的代碼;
沒有#號就是普通的if語句,
『叄』 請問C語言中的預處理命令ifdef是什麼意思
這幾個宏是為了進行條件編譯。一般情況下,源程序中所有的行都參加編譯。但是有時希望對其中一部分內容只在滿足一定條件才進行編譯,也就是對一部分內容指定編譯的條件,這就是「條件編譯」。有時,希望當滿足某條件時對一組語句進行編譯,而當條件不滿足時則編譯另一組語句。 條件編譯命令最常見的形式為: #ifdef 標識符 程序段1 #else 程序段2 #endif 它的作用是:當標識符已經被定義過(一般是用#define命令定義),則對程序段1進行編譯,否則編譯程序段2。 其中#else部分也可以沒有,即: #ifdef 程序段1 #endif 這里的「程序段」可以是語句組,也可以是命令行。這種條件編譯可以提高C源程序的通用性。如果一個C源程序在不同計算機系統上系統上運行,而不同的計算機又有一定的差異。例如,我們有一個數據類型,在Windows平台中,應該使用long類型表示,而在其他平台應該使用float表示,這樣往往需要對源程序作必要的修改,這就降低了程序的通用性。可以用以下的條件編譯: #ifdef WINDOWS #define MYTYPE long #else #define MYTYPE float #endif 如果在Windows上編譯程序,則可以在程序的開始加上 #define WINDOWS 這樣則編譯下面的命令行: #define MYTYPE long 如果在這組條件編譯命令之前曾出現以下命令行: #define WINDOWS 0 則預編譯後程序中的MYTYPE都用float代替。這樣,源程序可以不必作任何修改就可以用於不同類型的計算機系統。當然以上介紹的只是一種簡單的情況,可以根據此思路設計出其它的條件編譯。 例如,在調試程序時,常常希望輸出一些所需的信息,而在調試完成後不再輸出這些信息。可以在源程序中插入以下的條件編譯段: #ifdef DEBUG print ("device_open(%p)\n", file); #endif 如果在它的前面有以下命令行: #define DEBUG 則在程序運行時輸出file指針的值,以便調試分析。調試完成後只需將這個define命令行刪除即可。有人可能覺得不用條件編譯也可達此目的,即在調試時加一批printf語句,調試後一一將printf語句刪除去。的確,這是可以的。但是,當調試時加的printf語句比較多時,修改的工作量是很大的。用條件編譯,則不必一一刪改printf語句,只需刪除前面的一條「#define DEBUG」命令即可,這時所有的用DEBUG作標識符的條件編譯段都使其中的printf語句不起作用,即起統一控制的作用,如同一個「開關」一樣。 有時也採用下面的形式: #ifndef 標識符 程序段1 #else 程序段2 #endif 只是第一行與第一種形式不同:將「ifdef」改為「ifndef」。它的作用是:若標識符未被定義則編譯程序段1,否則編譯程序段2。這種形式與第一種形式的作用相反。 以上兩種形式用法差不多,根據需要任選一種,視方便而定。 還有一種形式,就是#if後面的是一個表達式,而不是一個簡單的標識符: #if 表達式 程序段1 #else 程序段2 #endif 它的作用是:當指定的表達式值為真(非零)時就編譯程序段1,否則編譯程序段2。可以事先給定一定條件,使程序在不同的條件下執行不同的功能。 例如:輸入一行字母字元,根據需要設置條件編譯,使之能將字母全改為大寫輸出,或全改為小寫字母輸出。 #define LETTER 1 main() { char str[20]="C Language",c; int i=0; while((c=str[i])!='\0'){ i++; #if LETTER if(c>='a'&&c<='z') c=c-32; #else if(c>='A'&&c<='Z') c=c+32; #endif printf("%c",c); } } 運行結果為:C LANGUAGE 現在先定義LETTER為1,這樣在預處理條件編譯命令時,由於LETTER為真(非零),則對第一個if語句進行編譯,運行時使小寫字母變大寫。如果將程序第一行改為: #define LETTER 0 則在預處理時,對第二個if語句進行編譯處理,使大寫字母變成小寫字母(大寫字母與相應的小寫字母的ASCII代碼差32)。此時運行情況為: c language 有人會問:不用條件編譯命令而直接用if語句也能達到要求,用條件編譯命令有什麼好處呢?的確,此問題完全可以不用條件編譯處理,但那樣做目標程序長(因為所有語句都編譯),而採用條件編譯,可以減少被編譯的語句,從而減少目標的長度。當條件編譯段比較多時,目標程序長度可以大大減少。
『肆』 #if !defined 與啥區別
在C/C++編程中,#ifdef和#if defined是預處理器指令,用於條件編譯。它們的主要區別在於使用范圍和檢查多個預編譯變數的能力。#ifdef主要用來檢查一個宏是否被定義,而#if defined則能處理更復雜的邏輯,允許同時檢查多個條件。
#ifdef與#endif的組合通常用於簡單地包含或排除代碼塊,如這樣:
#ifdef _DEBUG
...// 當_DEBUG宏被定義時,這部分代碼將被編譯
#endif
然而,#if defined提供了更大的靈活性,可以處理如下的多條件判斷:
#if (!defined(_DEBUG) && defined(USE_MYLIB))
...// 當_DEBUG未定義且USE_MYLIB被定義時,這部分代碼將被執行
#endif
相比之下,如果想在#ifdef中實現類似的功能,需要嵌套使用,比如:
#ifndef _DEBUG
#ifdef USE_MYLIB
...// 當_DEBUG未定義且USE_MYLIB被定義時,這部分代碼會執行
#endif
#endif
因此,總結來說,#ifdef適用於單一的宏檢查,而#if defined則適用於處理多個條件的復雜邏輯。在實際編程中,根據需求選擇合適的預處理器指令是關鍵。
『伍』 #if與if什麼區別啊
區別1:
#if是條件編譯;if是條件語句。
區別2:
if是條件語句,#if是預處理指令,功能相同,執行的時期不同。
區別3:
if的作用是程序流控制,會直接編譯、執行。
#if是對編譯器的指令,其作用是告訴編譯器,有些語句行希望在條件滿足時才編譯。
區別4:
#if作用是:如果(MAX==10)||(MAX==20)成立,那麼編譯器就會把其中的#if 與 #endif之間的代碼編譯進去
if作用是可以構成分支結構,它根據給定的條件進行判斷,以決定執行某個分支程序段。
『陸』 C++ if()是不是條件編譯指令
if()屬於判斷語句,不是條件編譯指令。
與if類似的條件編譯指令為#if和#ifdef。
條件編譯指令屬於預編譯語句,即編譯器在執行編譯工作時,會第一步處理預編譯語句,之後再進行剩餘的編譯工作。
在C語言中,所有的預編譯語句都是以#開頭的,如#define, #undef,#if等等。
條件編譯指令包括以下幾項:
1 #if
當後續的參數為真時執行編譯。
2 #ifdef/#ifndef
#ifdef當後續的宏定義被定義時執行編譯。
#ifndef當後續的宏定義沒有被定義時執行編譯。
3 #elif
與C語言語句中的else if類似,與#if或#ifdef連用,當後續參數為真時執行編譯。
4 #endif
用於條件編譯結尾,表示條件編譯結束。
『柒』 C++中if、#if與#ifdef、#ifndef彼此的區別
1、意義不同
#開頭的都是預編譯指令,就是在正式編譯之前,編譯器做一些預處理的工作
,所以說#if與#ifdef、#ifndef都是,而if是判斷語句,不是預編譯指令。
2、用法
if是條件語句,在運行的過程中根據條件的值選擇執行不同的語句。
#if是條件編譯語句,在編譯階段執行,如果後面跟的條件成立,就編譯對應的語句。
#ifdef是條件編譯語句,在編譯階段執行,後面跟一個宏的名稱,如果這個宏已經定義了,就編譯對應的語句。
#ifndef是條件編譯語句,在編譯階段執行,後面跟一個宏的名稱,如果這個宏沒有定義,就編譯對應的語句。
C++中if、#if與#ifdef、#ifndef的具體使用方法
一、#ifdef 和 #ifndef 指令 (C/C++)
只要能夠使用 #if,就可以使用 #ifdef 和 #ifndef 指令,在定義 identifier 時,#ifdef identifier 語句與 #if 1 等效,當 identifier 未定義或沒有使用 #undef 指令進行定義時,該語句與 #if 0 等效。
這些指令只檢查使用 #define 定義的標識符是否存在,而不檢查在 C 或 C++ 源代碼中聲明的標識符。
提供這些指令只是為了實現與該語言的早期版本的兼容性。 優先選擇將 defined( identifier ) 常量表達式與 #if 指令一起使用。
#ifndef 指令檢查 #ifdef 所檢查的條件的相反值。 如果尚未定義標識符(或已使用 #undef 移除其定義),則條件為 true(非零)。 否則,條件為 false (0)。
二、#if :
源文件中的每個#if指令必須與表示結束的 #endif指令匹配,任意數量的 #elif指令可以出現在 #if 和 #endif指令之間。
但最多允許一個 #else 指令,且 #else指令(如果有)必須是#endif之前的最後一個指令。
『捌』 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語言 #if 和if的區別
有區友如春別,#if 是預編譯。#if如果不橡哪是真的好耐話, 其後面的代碼是不會被編譯的。跟#ifdef 差不多,只是#if後面跟的是條件,而 #ifdef後面跟的是一個宏,判斷其是否定義。