導航:首頁 > 程序命令 > 預處理命令用什麼結尾

預處理命令用什麼結尾

發布時間:2023-04-10 17:38:36

1. 編譯預處理命令以什麼結尾

C和C++裡面預處理結束時用換行符就行了。

2. 預處理類型

1. 預處理程序

按照ANSI標準的定義,預處理程序應該處理以下指令:

#if #ifdef #ifndef #else #elif

#endif

#define

#undef

#line

#error

#pragma

#include

顯然,上述所有的12個預處理指令都以符號#開始,,每條預處理指令必須獨佔一行。

2. #define

#define指令定義一個標識符和一個串(也就是字元集),在源程序中發現該標識符時,都用該串替換之。這種標識符稱為宏名字,相應的替換稱為宏代換。一般形式如下:

#define macro-name char-sequence

這種語句不用分號結尾。宏名字和串之間可以有多個空白符,但串開始後只能以新行終止。

例如:我們使用LEFT代表1,用RIGHT代表0,我們使用兩個#define指令:

#define LEFT 1

#define RIGHT 0

每當在源程序中遇到LEFT或RIGHT時,編譯程序都用1或0替換。

定義一個宏名字之後,可以在其他宏定義中使用,例如:

#define ONE 1

#define TWO ONE+ONE

#define THREE ONE+TWO

宏代換就是用相關的串替代標識符。因此,如果希望定義一條標准錯誤信息時,可以如下定義:

#define ERROR_MS 「Standard error on input \n」

如果一個串長於一行,可在行尾用反斜線」\」續行,如下:

#define LONG_STRING 「This is a very very long \

String that is used as an example」

3. #error

#error指令強制編譯程序停止編譯,它主要用於程序調試。#error指令的一般形式是:

#error error-message

注意,宏串error-message不用雙引號包圍。遇到#error指令時,錯誤信息被顯示,可能同時還顯示編譯程序作者預先定義的其他內容。

4. #include

程序中的#include指令要求編譯程序讀入另一個源文件。被讀入文件的名字必須用雙引號(「」)或一對尖括弧(<>)包圍,例如:

#include 「stdio.h」

#include 都使C編譯程序讀入並編譯頭文件以用於I/O系統庫函數。

包含文件中可以包含其他#include指令,稱為嵌套包含。允許的最大嵌套深度隨編譯器而變。

文件名被雙括弧或尖括弧包圍決定了對指定文件的搜索方式。文件名被尖括弧包圍時,搜索按編譯程序作者的定義進行,一般用於搜索某些專門放置包含文件的特殊目錄。當文件名被雙括弧包圍時,搜索按編譯程序實時的規定進行,一般搜索當前目錄。如未發現,再按尖括弧包圍時的辦法重新搜索一次。

通常,絕大多數程序員使用尖括弧包圍標準的頭文件,雙引號用於包圍與當前程序相關的文件名。

5. 條件編譯指令

若干編譯指令允許程序員有選擇的編譯程序源代碼的不同部分,這種過程稱為條件編譯。

5.1#if、#else、#elif #endif

條件編譯指令中最常用的或許是#if,#else,#elif和#endif。這些指令允許程序員根據常數表達式的結果有條件的包圍部分代碼。

#if的一般形式是:

#if constant-expression

Statement sequence

#endif

如#if後的常數表達式為真,則#if和#endif中間的代碼被編譯,否則忽略該代碼段。#endif標記#if塊的結束。

#else指令的作用與C語言的else相似,#if指令失敗時它可以作為備選指令。例如:

#include #define MAX 100

Int main(void)

{
#if MAX>99

printf(「Compiled for array greater than 99.\n」);

#else

printf(「Complied for small array.\n」);

#endif

return 0;

}

注意,#else既是標記#if塊的結束,也標記#else塊的開始。因為每個#if只能寫一個#endif匹配。

#elif指令的意思是「否則,如果」,為多重編譯選擇建立一條if-else-if(如果-否則-如果鏈)。如果#if表達式為真,該代碼塊被編譯,不測試其他#elif表達式。否則,序列中的下一塊被測試,如果成功則編譯之。一般形式如下:

#if expression

Statement sequence

#elif expression1

Statement sequence

#elif expression2

Statement sequence

.

.

.

#elif expression

Statement sequence

#endif

5.2#ifdef和#ifndef

條件編譯的另一個方法是使用編譯指令#ifdef和#ifndef,分別表示「如果已定義」和「如果未定義」。#ifdef的一般形式如下:

#ifdef macro-name

Statement sequence

#endif

如果macro-name原先已經被一個#define語句定義,則編譯其中的代碼塊。

#ifndef的一般形式是:

#ifndef macro-name

Statement sequence

#endif

如果macro-name當前未被#define語句定義,則編譯其中的代碼塊。

我認為,用這種,可以很方便的開啟/關閉整個程序的某項特定功能。

#ifdef和#ifndef都可以使用#else或#elif語句。

#inlucde #define T 10

Int main(void)

{
#ifdef t

Printf(「Hi T\n」);

#else

Printf(「Hi anyone\n」);

#endif

#ifndef M

Printf(「M Not Defined\n」);

#endif

Return 0;

}

6. #undef

#undef指令刪除前面定義的宏名字。也就是說,它「不定義」宏。一般形式為:

#undef macro-name

7. 使用defined

除#ifdef之外,還有另外一種確定是否定義宏名字的方法,即可以將#if指令與defined編譯時操作符一起使用。defined操作符的一般形式如下:

defined macro-name

如果macro-name是當前定義的,則表達式為真,否則為假。

例如,確定宏MY是否定義,可以使用下列兩種預處理命令之一:

#if defined MY



#ifdef MY

也可以在defined之前加上感嘆號」!」來反轉相應的條件。例如,只有在DEBUG未定義的情況下才編譯。

#if !defined DEBUG

Printf(「Final Version!\n」);

#endif

使用defined的一個原因是,它允許由#elif語句確定的宏名字存在。

8. #line

#line指令改變__LINE__和__FILE__的內容。__LINE__和__FILE__都是編譯程序中預定義的標識符。標識符__LINE__的內容是當前被編譯代碼行的行號,__FILE__的內容是當前被編譯源文件的文件名。#line的一般形式是:

#line number 「filename」

其中,number是正整數並變成__LINE__的新值;可選的「filename」是合法文件標識符並變成__FILE__的新值。#line主要用於調試和特殊應用。

9. #pragma

#pragma是編譯程序實現時定義的指令,它允許由此向編譯程序傳入各種指令。例如,一個編譯程序可能具有支持跟蹤程序執行的選項,此時可以用#pragma語句選擇該功能。編譯程序忽略其不支持的#pragma選項。#pragma提高C源程序對編譯程序的可移植性。

10. 預處理操作符#和##

有兩個預處理操作符:#和##,它們可以在#define中使用。

操作符#通常稱為字元串化的操作符,它把其後的串變成用雙引號包圍的串。例如:

#include #define mkstr(s) #s

int main(void)

{
Printf(mkstr(I like C));

Return 0;

}

預處理程序把以下的語句:

Printf(mkstr(I like C));

變成

Printf(「I like C」);

操作符##把兩個標記拼在一起,形成一個新標記。例如:

#include #define concat(a,a) a##b

int main(void)

{
Int xy = 10;

Printf(「%d」,concat(x,y));

Return 0;

}

預處理程序把以下語句:

Printf(「%d」,concat(x,y));

變成

Printf(「%d」,xy);

操作符#和##主要作用是允許預處理程序對付某些特殊情況,多數程序中並不需要。

11. 預定義宏

C規范了5個固有的預定義宏,它們是:

__LINE__

__FILE__

__DATE__

__TIME__

__STDC__

__LINE__和__FILE__包含正在編譯的程序的行號和文件名。

__DATE__和內容形如month/day/year(月/日/年)的串,代表源文件翻譯成目標碼的日期。

__TIME__中的串代表源代碼編譯成目標碼的時間,形如hour:minute:second(時:分:秒)

如果__STDC__的內容是十進制常數1,則表示編譯程序的實現符合標准C。

3. 預編譯命令行由什麼符號開頭

#include "stdio.h"
#define P 3
void *F(int x)/*定義一個無類型函數,它有返回值,只是返回的值是指向無類型數據的指針*/

void main(){printf("%d\n",(int)F(1+3));/*將無類型函數F返回的指針值通過(int)強制轉換為int型*/

還有幾個問題,
1.預處理命令行必須位於源文件的開頭是對是錯?為什麼?
對!
編譯器在編譯源代碼時都是從開頭到結尾依次讀取,自己定義的變數、宏等等都得放前面,這樣在編譯器在讀到它們時就作一個記錄;
在使用這些變數、宏時,編譯器會在記錄中去尋找,如果找不到就會報錯——此變數未被定義。

函數可以放在結尾(main()之後),但是必須在開頭作一個函數聲明(也叫函數原型)以使編譯器為它作記錄,以便以後使用它時可以在記錄中找到它。
函數也可以放在前面(main()之前),此時就不用再聲明了,編譯器在讀到它時也會作一個記錄。

總之,自己定義的東西都得先聲明後使用,否則使用時在記錄中會找不到它。

預處理命令也是自己定義的東西,同屬這一范疇。

2.為什麼在源文件的一行上不能有多條預處理命令?
每條C語句都有一個「;」作結尾,即使都放一行,編譯器都能分辨得出。
預處理命令並不以「#」作為結尾標記,放一行的話編譯器是無法分辨的,它會把此行作為一個語句處理

通常的語句最好都分行寫,否則程序量大時是不便排錯的。

3.若有下列說明和定義
union dt
date;
變數data所佔內存位元組數與成員c所佔位元組數相同,為什麼?

聯合體的長度是其最長成員(如double c)的長度。
聯合體在內存中的存儲形式:
聯合體所有成員a,b,c都是同一地址,也就是說他們共同佔用這一段內存。
以TC3.0為例,a占這一段內存的頭2個位元組,b占這一段內存的頭一個位元組,c占這一段內存的全部位元組(也就是頭4個位元組)

4.為什麼以下不對
char *sp;*sp="right!";
char s[10];s="right!";
一、進行字元串賦值時可以在定義時:直接在字元串定義後接「="right"」
如:char *sp="right";
或者 char s[10]="right";

二、也可以在非定義時,這時左值必須是左值必須是字元串指針變數。
如:sp="right!";
以下都是錯誤用法:
*sp="right!";//左值不是字元串指針變數
s="right!";//左值只是字元串指針 常量

1、如果說*a包含(x和\0),而*b包含(x和y),拿*a-*b會得出什麼結果,*a和*b都是char型變數的話

最終的表達式*a-*b中,a points to '\0',b points to 'y',so 表達式*a-*b代表的是'\0'-'y',結果是-121(y的ASCII是121)

point(char*p)
main()
{
char b[4]={'a','b','c','d'),*p=b;
point(p); printf("%c\n",*p);
}
A.a B.b C.c D.d
選哪個?為什麼?

選D,p最初是首地址b,然後p是b+3,此時*p相當*(b+3)、b[3].

2號問題:
main()
,,,},i,j;
for(i=0;i<4;i++)
{for (j=0;j<i,j++)
printf("%4c",' ');/*原題就是'和'之間只有個空格,我也不清楚是怎麼回事*/
for(j=__;j<4;j++)
printf(%4d",num[i][j]);
printf("\n");
}
}
printf("%4c",' '); 其中的' '其實是一個空格字元常量,這個同'a','b','c'等字元常量是一樣的。
這個語句中%4c是指要讀取一個字元(這個字元就是後面的空格字元常量' ')並輸出,這個字元在顯示器上應該佔4格。所以此句的功能是輸出4個空格(空格也是屬於字元)。
你改成printf("%4c",'a');printf("%4c",'b');試下,它是輸出3個空格和一個字元。
printf("%8c",' ');是輸出8個空格,這個比printf(" ");來實現輸出8個字元來得方便。

若要按下列形式輸出數組右上半三角(什麼玩意?)。
1 2 3 4 i=0,j=i,那麼j可以是0,1,2,3
6 7 8 i=1,j=i,那麼j可以是1,2,3
11 12 i=2,j=i,那麼j可以是2,3
16 i=3,j=i,那麼j可以是3
則下劃線處應填入的是?為什麼?(B)
A.i-1 B.i
C.i+1 D.4-i

3號問題:
程序中若有下列說明和定義語句:
char fun(char*);
main()
{
char *s="one",a[5]=,(*fl)()=fun,ch;
......
}
下列選項中對函數的正確調用語句是?為什麼?
A.(*fl)(a);
B.*fl(*s);
C.fun(&a);
D.ch=*fl( s);

選擇A,根據定義char fun(char*),形參必須是一個字元指針,"a","s"才是字元指針(char pointer),而"*s" is char variable,"&a" is invalid.所以排除B、C

只有fun、*fl才是函數入口地址.
B.*fl(*s);相當於*(fl(*s)),錯誤,指針運算符只能針對指針運算,fl(*s)得到的是int,不是指針,下同。故排除B、D.
D.*fl( s);相當於*(fl( s));

4號問題
#define S(x) 4*x*x+1
main()
{
int i=6,j=8;
printf("%d",S(i+j));
getchar();
}
這個函數的輸出結果是多少?怎麼得的?

得到81.
因為S(i+j)經過預編譯用i+j替換x後,它被展開為4*i+j*i+j+1。即(4*6+8*6+8+1)
你應該這樣改:
#define S(x) 4*(x)*(x)+1
或者 printf("%d",S((i+j)));即將i+j用括弧括起來(i+j),這樣就在替換時用(i+j)替換x

4. include指的是什麼

include是一個計算機專業術語,它指C/C++中包含頭文件命令,用於將指定頭文件嵌入源文件中。二指include 指令,在JSP中包含一個靜態的文件,同時解析這個文件中的JSP語句。三指PHP語句。

(4)預處理命令用什麼結尾擴展閱讀:

#include <stdio.h>

#include<stdio.h>是在程序編譯之前要處理的內容,稱為編譯預處理命令。編譯預處理命令還有很多,它們都以「#」開頭,並且不用分號結尾,所以是c語言的程序語句。

在程序中用到系統提供的標准函數庫中的輸入輸出函數時,應在程序的開頭寫上一行:#include"stdio.h"或者是#include<stdio.h>,這樣才能調用庫函數。二者主要在於查找效率上有差別,#include<stdio.h>一般用包含系統文件,它是查找先從系統目錄查找開始查找;#include "蘆慶stdio.h"一般用包含項目文件,它是查找先從項目目錄查找開始查找。缺尺

在編寫C語言中,伏嘩高常用到printf()和scanf()函數,他們就是stdio.h中的兩個標准輸入輸出函數,所以編程語句中如果要用到此兩個函數就一定要在頭文件中加入#include<stdio.h>。

5. c語言 選擇題,選正確的,選好了給個說明

A)預處理命令行必須位於源文件的開頭
B)在源文件的一悉兄行上可以有多條預處理命令
C)宏名必須用大寫字母表示
D)宏替換不佔用程序的運行時間
答案:D
評析:通常,預處理命令位於源文件的開頭,也可以寫在函數與函數之間;不能在一行上寫多條預處理命令:宏名一般習慣用大寫字母表示,以便與變數名相區別,但這並非規定,也可睜判襲用小寫字母。

預處理命令是以#號開頭的代碼行,每一條預處理命令必須單獨佔用一行,由於不是C的語句,因此在結尾不能有分號「;」。

宏被定義後,其作用域一般為定義它的文件,通常#define命令寫在文件的開頭,但這也並非規定,實際上宏沖伏定義可以出現在程序的任何地方,但必須位於引用之前。

6. 在C語言中,什麼情況下子函數的結尾要添加「;」

函數結尾是不用加「;」的,如樓上所說,只有聲明的時候需要。
至於這邊三個函數,其實最後「;」是多餘的,編譯的時候,編譯器讀到「}」匹配後就知道這個函數結束,而後面的「;」,編譯器會認為是一個空語句,相當於什麼也沒干,是不會報錯的,運行時也不會出錯。
「;」一般用於一個語句的語句的結尾,在函數的結尾、預處理嘩羨命令的結尾都是不需要加的,一般容易忘的是,亂漏拍在類和搜搭結構體定義的結尾要加「;」

7. C中的temp是什麼意思

temp是一個變數名,變數是以某標識符為名字,其值塌嘩可以改變的量。

變數temp在此程序中起中間交換的作用。

比如a和b交換的時候,先將a的值賦予temp,再將b的值賦予a,此時temp的值就是原先a的值,此刻就可以將temp賦予給b。a和b就完成交換了。

(7)預處理命令用什麼結尾擴展閱讀虧衫盯:

C語言需要說明的是:

1、一個C語言源程序可以由一個或多個源文件組成。

2、每個源文件可由一個或多個函銷和數組成。

3、一個源程序不論由多少個文件組成,都有一個且只能有一個main函數,即主函數。是整個程序的入口。

4、源程序中可以有預處理命令(包括include 命令,ifdef、ifndef命令、define命令),預處理命令通常應放在源文件或源程序的最前面。

5、每一個說明,每一個語句都必須以分號結尾。但預處理命令,函數頭和花括弧「}」之後不能加分號。結構體、聯合體、枚舉型的聲明的「}」後要加「 ;」。

6、標識符,關鍵字之間必須至少加一個空格以示間隔。若已有明顯的間隔符,也可不再加空格來間隔。

網路-c語言

8. c語言源程序的擴展名是什麼

c語言源程序的擴展名是:「.c」。由C語言構成的指令序列稱為C源程序,源程序文件的後綴為「.c」。註:在絕大多數的操作系統里,C源代碼文件的後綴的大小寫無所謂,如「index.C」和「index.c」指的是同一個文件;但老練的程序員通常使用小寫。

對於計算機語言來說,其源代碼文件的命名會有一個特定的後綴。如C++的源代碼文件的後綴是「.cpp」;Python的源代碼文件的後綴是「.py」;而C的源代碼文件的後綴則是「.C」。

源程序的結構特點

1、一個C語言源程序可以由一個或多個源文件組成。

2、每個源文件可由一個或多個函數組成。

3、一個源程序不論由多少個文件組成,都有一個且只能有一個main函數,即主函數。

4、源程序中可以有預處理命令(include 命令僅為其中的一種),預處理命令通常應放在源文件或源程序的最前面。

5、每一個說明,每一個語句都必須以分號結尾。但預處理命令,函數頭和花括弧「}」之後不能加分號。

6、標識符,關鍵字之間必須至少加一個空格以示間隔。若已有明顯的間隔符,也可不再加空格來間隔。

9. 預處理命令 #elif 只能用在 #if 後面嗎

#elif B/冊族/估計你寫慧姿如錯了,應該是#elseif B;這個需要配對使前啟用的,elseif也可以不出現,就像一樓寫的那樣

閱讀全文

與預處理命令用什麼結尾相關的資料

熱點內容
excel表格單列數據加密 瀏覽:646
給同事的解壓話語 瀏覽:990
linux關閉網卡命令行 瀏覽:452
史上最漂亮程序員 瀏覽:768
java實現excel的導入 瀏覽:758
光遇賬號如何轉移安卓 瀏覽:266
5分之13除以26的演算法 瀏覽:342
蘭州安寧區買解壓包子 瀏覽:641
php接收圖片代碼 瀏覽:668
hci命令 瀏覽:662
福建伺服器大區雲空間 瀏覽:840
筆桿子程序員 瀏覽:745
手機軟體易驗證加密 瀏覽:589
文檔加密只讀模式也不能看到 瀏覽:431
把jpg轉換成pdf的軟體 瀏覽:874
linuxeth0mac 瀏覽:192
windows編程知乎 瀏覽:442
壓縮工期超過40 瀏覽:249
Android怎麼優化內存 瀏覽:106
linuxetcsysconfig 瀏覽:396