預處理器指令或編譯器
① int前面應該有分號
C – 錯誤C2144語法錯誤:』int』前面應加』;』
C&C++ 2019-12-19
我正在嘗試編譯這個C代碼:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "general_configuration.h"
#include "helper_functions.h"
#define LINE_LEN 80
// file_with_as_ext returns 1 if the input has .as extension
int file_with_as_ext(char* input)
{
char* dot_value = strchr(input,'.');
if (dot_value == NULL)
return 0;
else
{
if (strcmp(dot_value,".as") == 0)
return 1;
}
}
但是我收到錯誤「C2144:語法錯誤:』int』應該以』;』開頭」
我無法理解為什麼,#define不需要』;』在末尾.
任何想法?
解決方法
首先,您發布的代碼以雜散的反引號開頭.如果那真的在你的代碼中,你應該刪除它.
其次,如果您使用該行結束了您的功能,編譯器會更快樂並發出更少的警告
return 0; // unreachable
這是很好的C風格,值得推薦. (在你的情況下,這條線實際上是可以到達的,在這種情況下,這條線不僅是好的風格,而且是正確操作所必需的.檢查一下.)
否則,你的代碼看起來可以正常,除了一些小的反對意見,可以提出關於#define的過時的,C風格的使用以及關於一個或兩個其他小風格點.關於#define,它不是C源代碼,而是預處理器指令.它實際上由與編譯器不同的程序處理,並在編譯器看到它之前被適當的C代碼刪除並替換.預處理器對分號不感興趣.這就是#define行不以分號結尾的原因.開始#的其他行也不以分號結尾.
正如@JoachimIsaksson所指出的,在文件general_configuration.h或文件helper_function.h的末尾可能缺少所需的分號.您應該檢查每個文件中的最後一行
② C#中的預處理器命令是指什麼有什麼作用,能幹什麼
預處理器命令從來不會被翻譯為可執行代碼中的命令,但會影響編譯過程的各個方面。例如:使用預處理器指令可以禁止編譯器編譯代碼的某一部分,如果計劃發布兩個版本的代碼,即基本版本和有更多功能的企業版本,即可以使用這些預處理器指令。在編譯軟體的基本版本時,使用預處理器指令還可以禁止編譯器編譯於額外功能相關的代碼。另外,在編寫提供調試信息的代碼時,也可以使用預處理器指令。在銷售軟體時,一般不希望編譯這部分代碼。預處理器指令開頭都有符號#。
③ 國家計算機二級考試c語言部分,C語言程序設計用的是哪個軟體
C語言程序設計用的是:Microsoft visual c++。
C語言考試滿分為100分,其中選擇題目40分,程序填空18分,程序修改18分,程序設計24分。通關的條件是總分達到60分以上而且選擇題要達到20分以上。
全國計算機二級c語言考試內容主要包括:C 語言程序的結構、數據類型及其運算、基本語句等12個內容。考試形式為上機考試,考試時長120分鍾,滿分100分。

(3)預處理器指令或編譯器擴展閱讀
全國計算機等級考試二級教程--C語言程序設計考試要點:
1、#include 這行代碼是一條C預處理器指令。通常,C編譯器在編譯前會對源代碼做一些准備工作,即預處理;#include 中的#符號表明,C預處理器在編譯器接手之前處理這條指令。
2、聲明注意事項:
(1)只可以用小寫字母、大寫字母、數字、下劃線來命名,而且名稱一個字元必須是字元或下劃線,不能是數字;
(2)最好不要把初始化變數和未初始化的變數放在同一條聲明中;
(3)大小寫字母是被認為是兩個不同的字元;
(4)用戶標識符與關鍵字相同,則在對程序進行編譯時系統將給出出錯信息;如果用戶標識符與預定義標識符相同,系統並不報錯,只是該預定義標識符將失去原定含義;
(5)#define命令行的最後不得加分號。
④ 關於C語言預處理命令
C程序的源代碼中可包括各種編譯指令,這些指令稱為預處理命令。雖然它們實際上不是C語言的一部分,但卻擴展了C程序設計的環境。本節將介紹如何應用預處理程序和注釋簡化程序開發過程,並提高程序的可讀性。ANSI標準定義的C語言預處理程序包括下列命令:
#define,#error,#include,#if,#else,#elif,#endif,#ifdef,#ifndef,#undef,#line,#pragma等。非常明顯,所有預處理命令均以符號#開頭,下面分別加以介紹。
一 #define
命令#define定義了一個標識符及一個串。在源程序中每次遇到該標識符時,均以定義的串代換它。ANSI標准將標識符定義為宏名,將替換過程稱為宏替換。命令的一般形式為:
#define identifier string
注意:
1該語句沒有分號。在標識符和串之間可以有任意個空格,串一旦開始,僅由一新行結束。
2宏名定義後,即可成為其它宏名定義中的一部分。
3 宏替換僅僅是以文本串代替宏標識符,前提是宏標識符必須獨立的識別出來,否則不進行替換。例如:
#define XYZ this is a tes
使用宏printf("XYZ");//該段不列印"this is a test"而列印"XYZ"。因為預編譯器識別出的是"XYZ"
4如果串長於一行,可以在該行末尾用一反斜杠' \'續行。
#defineLONG_STRING"this is a very long\
string that is used as an example"
5 C語言程序普遍使用大寫字母定義標識符。
6 用宏代換代替實在的函數的一大好處是宏替換增加了代碼的速度,因為不存在函數調用的開銷。但增加速度也有代價:由於重復編碼而增加了程序長度。
二 #error
命令#error強迫編譯程序停止編譯,主要用於程序調試。
#error指令使預處理器發出一條錯誤消息,該消息包含指令中的文本.這條指令的目的就是在程序崩潰之前能夠給出一定的信息。
三 #include
命令#i nclude使編譯程序將另一源文件嵌入帶有#include的源文件,被讀入的源文件必須用雙引號或尖括弧括起來。例如:
#include"stdio.h"或者#include<stdio.h>
這兩行代碼均使用C編譯程序讀入並編譯用於處理磁碟文件庫的子程序。
將文件嵌入#i nclude命令中的文件內是可行的,這種方式稱為嵌套的嵌入文件,嵌套層次依賴於具體實現。
如果顯式路徑名為文件標識符的一部分,則僅在那些子目錄中搜索被嵌入文件。否則,如果文件名用雙引號括起來,則首先檢索當前工作目錄。如果未發現文件,則在命令行中說明的所有目錄中搜索。如果仍未發現文件,則搜索實現時定義的標准目錄。
如果沒有顯式路徑名且文件名被尖括弧括起來,則首先在編譯命令行中的目錄內檢索。如果文件沒找到,則檢索標准目錄,不檢索當前工作目錄。
四 條件編譯命令
有幾個命令可對程序源代碼的各部分有選擇地進行編譯,該過程稱為條件編譯。商業軟體公司廣泛應用條件編譯來提供和維護某一程序的許多顧客版本。
#if、#else,#elif及#endif
#if的一般含義是如果#if後面的常量表達式為true,則編譯它與#endif之間的代碼,否則跳過這些代碼。命令#endif標識一個#if塊的結束。
#if constant-expression
statement sequence
#endif
Eg:
#define MAX 91
#include <iostream>
using namespace std;
int main()
{
#if MAX > 99
cout<<"MAX is bigger than 99"<<endl;
#elif MAX > 90
cout<<"MAX is bigger than 90"<<endl;
#else
cout<<"MAX is smaller than 90"<<endl;
#endif
return 0;
}
跟在#if後面的表達式在編譯時求值,因此它必須僅含常量及已定義過的標識符,不可使用變數。表達式不許含有操作符sizeof(sizeof也是編譯時求值)。
#else命令的功能有點象C語言中的else;#else建立另一選擇(在#if失敗的情況下)。注意,#else屬於#if塊。
#elif命令意義與ELSE IF 相同,它形成一個if else-if階梯狀語句,可進行多種編譯選擇。#elif 後跟一個常量表達式。如果表達式為true,則編譯其後的代碼塊,不對其它#elif表達式進行測試。否則,順序測試下一塊。
#if expression
statement sequence
#elif expression1
statement sequence
#endif
在嵌套的條件編譯中#endif、#else或#elif與最近#if或#elif匹配。
# ifdef 和# ifndef
條件編譯的另一種方法是用#ifdef與#ifndef命令,它們分別表示"如果有定義"及"如果無定義"。# ifdef的一般形式是:
# ifdef macroname
statement sequence
#endif
#ifdef與#ifndef可以用於#if、#else,#elif語句中,但必須與一個#endif。
#define MAX 91
#include <iostream>
using namespace std;
int main()
{
#ifdef MAX
cout<<"hello,MAX!"<<endl;
#else
cout<<"where is MAX?"<<endl;
#endif
#ifndef LEO
cout<<"LEO is not defined"<<endl;
#endif
return 0;
}
命令#undef 取消其後那個前面已定義過有宏名定義。一般形式為:
#undef macroname
命令#line改變__LINE__與__FILE__的內容,它們是在編譯程序中預先定義的標識符。命令的基本形式如下:
#line number["filename"]
其中的數字為任何正整數,可選的文件名為任意有效文件標識符。行號為源程序中當前行號,文件名為源文件的名字。命令#line主要用於調試及其它特殊應用。注意:在#line後面的數字標識從下一行開始的數字標識。
#line 100 "jia"
cout<<"#line change line and filename!"<<endl; //line 100
cout<<__LINE__<<endl; //101
cout<<__FILE__<<endl; //jia
五 #pragma
命令#pragma 為實現時定義的命令,它允許向編譯程序傳送各種指令。
#pragma的作用是設定編譯器的狀態或者是指示編譯器完成一些特定的動作。#pragma指令對每個編譯器給出了一個方法,在保持與C和C++語言完全兼容的情況下,給出主機或操作系統專有的特徵。依據定義,編譯指示是機器或操作系統專有的,且對於每個編譯器都是不同的。
其格式一般為: #Pragma Para
1 message 參數。
Message 參數能夠在編譯信息輸出窗口中輸出相應的信息,這對於源代碼信息的控制是非常重要的。其使用方法為:
#pragma message(「消息文本」)
當編譯器遇到這條指令時就在編譯輸出窗口中將消息文本列印出來。
當在程序中定義了許多宏來控制源代碼版本的時候,自己有可能都會忘記有沒有正確的設置這些宏,此時可以用這條指令在編譯的時候就進行檢查。假設希望判斷自己有沒有在源代碼的什麼地方定義了_X86這個宏可以用下面的方法
#ifdef _X86
#pragma message(「_X86 macro activated!」)
#endif
當定義了_X86這個宏以後,應用程序在編譯時就會在編譯輸出窗口裡顯示「_
X86 macro activated!」。就不會因為不記得自己定義的一些特定的宏而抓耳撓腮了。
2 code_seg 參數。
格式如:
#pragma code_seg( ["section-name"[,"section-class"] ] )
它能夠設置程序中函數代碼存放的代碼段,當開發驅動程序的時候就會使用到它。
3 #pragma once (比較常用)
只要在頭文件的最開始加入這條指令就能夠保證頭文件被編譯一次。這條指令實際上在VC6中就已經有了,但是考慮到兼容性並沒有太多的使用它。
4 #pragma hdrstop
表示預編譯頭文件到此為止,後面的頭文件不進行預編譯。BCB可以預編譯頭文件以加快鏈接的速度,但如果所有頭文件都進行預編譯又可能占太多磁碟空間,所以使用這個選項排除一些頭文件。
有時單元之間有依賴關系,比如單元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) /* 不顯示4507和34號警告信息。如果編譯時總是出現4507號警告和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 warning( 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關鍵字,可以幫連入一個庫文件。
8 progma pack(n)
指定結構體對齊方式。#pragma pack(n)來設定變數以n位元組對齊方式。
n 位元組對齊就是說變數存放的起始地址的偏移量有兩種情況:
第一、如果n大於等於該變數所佔用的位元組數,那麼偏移量必須滿足默認的對齊方式,
第二、如果n小於該變數的類型所佔用的位元組數,那麼偏移量為n的倍數,不用滿足默認的對齊方式。
結構的總大小也有個約束條件,分下面兩種情況:如果n大於所有成員變數類型所佔用的位元組數,那麼結構的總大小必須為佔用空間最大的變數佔用的空間數的倍數; 否則必須為n的倍數。
下面舉例說明其用法。
#pragma pack(push) //保存對齊狀態
#pragma pack(4)//設定為4位元組對齊
struct test
{
char m1;
double m4;
int m3;
};
#pragma pack(pop)//恢復對齊狀態
為測試該功能,可以使用sizeof()測試結構體的長度!
⑤ c#代碼中#是什麼意思
#在很多地方都表示數字的含義。如文件記錄以#1,#2的方式表示文件編號1,編號2等。樓棟表示方法有#101,表示1棟1號房等。注意:此處應將「#」置於數字前。
#在英語中還代表英制重量單位「磅」,作為「磅」的符號時,數字應在「#」之前,如5#(5磅)、15.3#(15.3磅)等。與「第幾號」的用法剛剛相反。

(5)預處理器指令或編譯器擴展閱讀:
C語言中的 #
C#讀成C Sharp,意為C++++
# 本身為指令 沒有其他意義/也沒有其他效果
# 號必須是該行除了任何空白字元外的第一個字元。預處理指令就是以#號開頭的代碼行。
# 後是指令關鍵字,在關鍵字和#號之間允許存在任意個數的空白字元。
整行語句構成了一條預處理指令,該指令將在編譯器進行編譯之前對源代碼做某些轉換。
下面舉例說明下:
#define 標識符 字元串.
#include <頭文件名.h>
其中的「#」表示這是一條預處理命令。凡是以「#」開頭的均為預處理命令.。
⑥ c語言程序 輸入一個小寫字母,輸出它的大寫字母和與其大寫字母相鄰的兩個字母
scanf_s(" %c", &a);%c前添加空格,用於濾除空白符。
1、程序的第一行#include <stdio.h>是預處理器指令,告訴 C 編譯器在實際編譯之前要包含 stdio.h 文件。
2、下一行int main()是主函數,程序從這里開始執行。
3、下一行printf(...)是 C 中另一個可用的函數,會在屏幕上顯示消息 "Hello, World!"。
4、下一行return 0;終止 main() 函數,並返回值 0。

(6)預處理器指令或編譯器擴展閱讀:
C語言初學者比較喜歡的Turbo C2.0提供了400多個運行時函數,每個函數都完成特定的功能,用戶可隨意調用。這些函數總體分成輸入輸出函數、數學函數、字元串和內存函數、與BIOS和DOS有關的函數、 字元屏幕和圖形功能函數、過程式控制制函數、目錄函數等。
作為程序員應盡量熟悉目標平台庫函數其功能。這樣才能游刃有餘地開發特定平台的應用程序。比如作為Windows應用程序的開發者,應盡量熟悉Windows SDK;作為Linux應用程序開發者,應盡量熟悉Linux系統調用和POSIX函數規范。
⑦ c語言中預處理命令都有哪些
我們可以在C源程序中插入傳給編譯程序的各中指令,這些指令被稱為預處理器指令,它們擴充了程序設計的環境。現把常用的預處理命令總結如下: x0dx0a1. 預處理程序x0dx0a按照ANSI標準的定義,預處理程序應該處理以下指令:x0dx0a#if #ifdef #ifndef #else #elifx0dx0a#endifx0dx0a#definex0dx0a#undefx0dx0a#linex0dx0a#errorx0dx0a#pragmax0dx0a#includex0dx0a顯然,上述所有的12個預處理指令都以符號#開始,,每條預處理指令必須獨佔一行。x0dx0a2. #definex0dx0a#define指令定義一個標識符和一個串(也就是字元集),在源程序中發現該標識符時,都用該串替換之。這種標識符稱為宏名字,相應的替換稱為宏代換。一般形式如下:x0dx0a#define macro-name char-sequencex0dx0a這種語句不用分號結尾。宏名字和串之間可以有多個空白符,但串開始後只能以新行終止。x0dx0a例如:我們使用LEFT代表1,用RIGHT代表0,我們使用兩個#define指令:x0dx0a#define LEFT 1x0dx0a#define RIGHT 0x0dx0a每當在源程序中遇到LEFT或RIGHT時,編譯程序都用1或0替換。x0dx0a定義一個宏名字之後,可以在其他宏定義中使用,例如:x0dx0a#define ONE 1x0dx0a#define TWO ONE+ONEx0dx0a#define THREE ONE+TWOx0dx0a宏代換就是用相關的串替代標識符。因此,如果希望定義一條標准錯誤信息時,可以如下定義:x0dx0a#define ERROR_MS 「Standard error on input \n」x0dx0a如果一個串長於一行,可在行尾用反斜線」\」續行,如下:x0dx0a#define LONG_STRING 「This is a very very long \x0dx0aString that is used as an example」x0dx0a3. #errorx0dx0a#error指令強制編譯程序停止編譯,它主要用於程序調試。#error指令的一般形式是:x0dx0a#error error-messagex0dx0a注意,宏串error-message不用雙引號包圍。遇到#error指令時,錯誤信息被顯示,可能同時還顯示編譯程序作者預先定義的其他內容。x0dx0a4. #includex0dx0a程序中的#include指令要求編譯程序讀入另一個源文件。被讀入文件的名字必須用雙引號(「」)或一對尖括弧(<>)包圍,例如:x0dx0a#include 「stdio.h」x0dx0a#include
