C++編譯預處理

導語

在編譯器對源程序進行編譯之前,首先要由預處理器對程序文本進行預處理。預處理器提供一組編譯預處理指令和預處理操作符。預處理指令實際上不是C++語言的一部分,它是用來擴充C++程序設計的環境。所有的預處理指令在程序中都是以“#”來引導,每一條預處理指令單獨佔一行,不要用分號結束。預處理指令可以根據需要出現在程序中的任何位置。

一:預處理指令

1.1 #include

文件包含指令,作用是將另一個源文件嵌入到當前源文件中該點出。
例如:#include< iostream>或者#include”stdio.h”

1.2 #define和#undef

#define是用來定義符號常量,在程序內部使用應該保持先替換再計算的原則。用#define還可以定義空符號,#define MYHEAD_H 定義它的目的,僅僅是表示”MYHEAD_H已經定義過”這樣一種狀態。
例如:#define PI 3.14
#undef的作用是刪除由#define定義的宏,是之不起作用。

1.3 條件編譯指令

使用條件編譯指令,可以限定程序中的某些內容要在滿足一定條件的情況下才參與編譯。因此,利用條件編譯可以使同一個源程序在不同的編譯條件下產生不同的目標代碼。
#if #else #endif #elif #ifdef #ifndef

二:預處理操作符

deifned是一個預處理的操作符,而不是指令,因此不要以#開頭。

三:用法解析

注:示例來自點擊查看
方法:例如要編寫頭文件test.h
在頭文件開頭寫上兩行:
#ifndef _TEST_H
#define _TEST_H//一般是文件名的大寫
頭文件結尾寫上一行:
#endif
這樣一個工程文件裏同時包含兩個test.h時,就不會出現重定義的錯誤了。
分析:當第一次包含test.h時,由於沒有定義_TEST_H,條件爲真,這樣就會包含(執行)#ifndef _TEST_H和 #endif之間的代碼,當第二次包含test.h時前面一次已經定義了_TEST_H,條件爲假,#ifndef _TEST_H和#endif之間的代碼也就不會再次被包含,這樣就避免了重定義了。

#ifndef _optimizedvector_h // if not define _optimizedvector_h
#define _optimizedvector_h // then define _optimizedvector_h
通俗點就是如果沒定義_optimizedvector_h,那就定義_optimizedvector_h,防止重複編譯
頭文件中的#ifndef,這是一個很關鍵的東西。比如你有兩個C文件,這兩個C文件都include了同一個頭文件。而編譯時,這兩個C文件要一同編譯成一個可運行文件,於是問題來了,大量的聲明衝突。還是把頭文件的內容都放在#ifndef和#endif中吧。不管你的頭文件會不會被多個文件引用,你都要加上這個。一般格式是這樣的:
#ifndef <標識>
#define <標識>
……
#endif
<標識>在理論上來說可以是自由命名的,但每個頭文件的這個“標識”都應該是唯一的。標識的命名規則一般是頭文件名全大寫,前後加下劃線,並把文件名中的“.”也變成下劃線,

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章