c語言中預處理命令都有哪些
我們可以在C源程序中插入傳給編譯程序的各中指令,這些指令被稱為預處理器指令,它們擴充了程序設計的環境。
現把常用的預處理命令總結如下: 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
包含文件中可以包含其他#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
因為每個#if只能寫一個#endif匹配。#elif指令的意思是“否則,如果”,為多重編譯選擇建立一條if-else-if(如果-否則-如果鏈)。
如果#if表達式為真,該代碼塊被編譯,不測試其他#elif表達式。否則,序列中的下一塊被測試,如果成功則編譯之。
一般形式如下:#if expression Statement sequence#elif expression1 Statement sequence#elif expression2 Statement sequence。#elif expression Statement sequence#endif5.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
一般形式為:#undef macro-name7. 使用defined 除#ifdef之外,還有另外一種確定是否定義宏名字的方法,即可以將#if指令與defined編譯時操作符一起使用。defined操作符的一般形式如下:defined macro-name 如果macro-name是當前定義的,則表達式為真,否則為假。
例如,確定宏MY是否定義,可以使用下列兩種預處理命令之一:#if defined MY 或#ifdef MY 也。
C語言里面的預處理是什么意思
預處理 功能主要包括:宏定義,文件包含,條件編譯三部分。
分別對應宏定義命令,文件包含命令,條件編譯命令 三部分實現。預處理過程讀入源代碼,檢查包含預處理指令的語句和宏定義,并對源代碼進行響應的轉換。
預處理過程還會刪除程序中的注釋和多余的空白字符。預處理指令是以#號開頭的代碼行。
#號必須是該行除了任何空白字符外的第一個字符。#后是指令關鍵字,在關鍵字和#號之間允許存在任意個數的空白字符。
整行語句構成了一條預處理指令,該指令將在編譯器進行編譯之前對源代碼做某些轉換。 指令 用途 # 空指令,無任何效果 #include 包含一個源代碼文件 #define 定義宏 #undef 取消已定義的宏 #if 如果給定條件為真,則編譯下面代碼 #ifdef 如果宏已經定義,則編譯下面代碼 #ifndef 如果宏沒有定義,則編譯下面代碼 #elif 如果前面的#if給定條件不為真,當前條件為真,則編譯下面代碼 #endif 結束一個#if……#else條件編譯塊 #error 停止編譯并顯示錯誤信息 #else 條件編譯的否則選項 #error 指令將使編譯器顯示一條錯誤信息,然后停止編譯。
#line 指令可以改變編譯器用來指出警告和錯誤信息的文件號和行號。 #pragma 指令沒有正式的定義。
編譯器可以自定義其用途。典型的用法是禁止或允許某些煩人的警告信息。
文件包含在程序中包含頭文件有兩種格式:#include
第二種方法是用雙引號把頭文件括起來。這種格式告訴預處理程序在當前被編譯的應用程序的源代碼文件中搜索被包含的頭文件,如果找不到,再搜索編譯器自帶的頭文件。
采用兩種不同包含格式的理由在于,編譯器是安裝在公共子目錄下的,而被編譯的應用程序是在它們自己的私有子目錄下的。一個應用程序既包含編譯器提供的公共頭文件,也包含自定義的私有頭文件。
采用兩種不同的包含格式使得編譯器能夠在很多頭文件中區別出一組公共的頭文件。 舉個例子:#include
php 普通sql語句,處理成預處理語句
PHP MySQL 預處理語句 預處理語句對于防止 MySQL 注入是非常有用的。
預處理語句及綁定參數 預處理語句用于執行多個相同的 SQL 語句,并且執行效率更高。預處理語句的工作原理如下:預處理:創建 SQL 語句模板并發送到數據庫。
預留的值使用參數 "?" 標記 。例如:INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?) 數據庫解析,編譯,對SQL語句模板執行查詢優化,并存儲結果不輸出。
執行:最后,將應用綁定的值傳遞給參數("?" 標記),數據庫執行語句。應用可以多次執行語句,如果參數的值不一樣。
相比于直接執行SQL語句,預處理語句有兩個主要優點:預處理語句大大減少了分析時間,只做了一次查詢(雖然語句多次執行)。綁定參數減少了服務器帶寬,你只需要發送查詢的參數,而不是整個語句。
預處理語句針對SQL注入是非常有用的,因為參數值發送后使用不同的協議,保證了數據的合法性。MySQLi 預處理語句 以下實例在 MySQLi 中使用了預處理語句,并綁定了相應的參數:實例 (MySQLi 使用預處理語句)<?php$servername = "localhost";$username = "username";$password = "password";$dbname = "myDB";// 創建連接$conn = new mysqli($servername, $username, $password, $dbname);// 檢測連接 if ($conn->connect_error) { die("連接失敗: " . $conn->connect_error); }// 預處理及綁定$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)");$stmt->bind_param("sss", $firstname, $lastname, $email);// 設置參數并執行$firstname = "John";$lastname = "Doe";$email = "john@*";$stmt->execute();$firstname = "Mary";$lastname = "Moe";$email = "mary@*";$stmt->execute();$firstname = "Julie";$lastname = "Dooley";$email = "julie@*";$stmt->execute(); echo "新記錄插入成功";$stmt->close();$conn->close();?> 解析以下實例的每行代碼:"INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)" 在 SQL 語句中,我們使用了問號 (?),在此我們可以將問號替換為整型,字符串,雙精度浮點型和布爾值。
接下來,讓我們來看下 bind_param() 函數:$stmt->bind_param("sss", $firstname, $lastname, $email); 該函數綁定了 SQL 的參數,且告訴數據庫參數的值。 "sss" 參數列處理其余參數的數據類型。
s 字符告訴數據庫該參數為字符串。參數有以下四種類型:i - integer(整型) d - double(雙精度浮點型) s - string(字符串) b - BLOB(binary large object:二進制大對象) 每個參數都需要指定類型。
通過告訴數據庫參數的數據類型,可以降低 SQL 注入的風險。注意: 如果你想插入其他數據(用戶輸入),對數據的驗證是非常重要的。
PDO 中的預處理語句 以下實例我們在 PDO 中使用了預處理語句并綁定參數:實例 (PDO 使用預處理語句)<?php$servername = "localhost";$username = "username";$password = "password";$dbname = "myDBPDO"; try { $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); // 設置 PDO 錯誤模式為異常 $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 預處理 SQL 并綁定參數 $stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (:firstname, :lastname, :email)"); $stmt->bindParam(':firstname', $firstname); $stmt->bindParam(':lastname', $lastname); $stmt->bindParam(':email', $email); // 插入行 $firstname = "John"; $lastname = "Doe"; $email = "john@*"; $stmt->execute(); // 插入其他行 $firstname = "Mary"; $lastname = "Moe"; $email = "mary@*"; $stmt->execute(); // 插入其他行 $firstname = "Julie"; $lastname = "Dooley"; $email = "julie@*"; $stmt->execute(); echo "新記錄插入成功"; } catch(PDOException $e) { echo $sql . "" . $e->getMessage(); }$conn = null;?>。