使用#define
而非typedef
或using
的問題是,[如已經指出] #define
是宏,宏評估和預處理器擴展,所以編譯器不知道你想創建因爲#define
指令只需用後一切以取代的數據類型。
其原因在語言如C和C++使用宏是允許的事情是不特異性地與源代碼邏輯做的,但與源代碼結構做。
的#include
指令,例如,毫不誇張地包括文件到位derective的全部內容。
所以,如果myfile.h
包含:
void func_1(int t);
void func_2(int t);
然後
#inlude "myfile.h"
將擴大myfile.h
的內容,與
void func_1(int t);
void func_2(int t);
更換#include
預處理指令然後,編譯器走來並編譯擴展文件h類定義和其他擴展宏!
這就是爲什麼宏觀
#pragma once
或
#ifndef __MYFILE_INCLUDE__
#define __MYFILE_INCLUDE__
是在頭文件開始時使用,以防止發生多種定義。
當您使用表達式像#define INT64 unsigned int
預處理程序所做的完全一樣的東西。它評估表達式,然後用unsigned int
替換所有出現的INT64
。
當您使用typedef,而另一方面,編譯器可以進行類型替代,這意味着編譯器警告不正確使用新創建的類型。
#define
只會提醒您錯誤地使用了unsigned int
,如果您有很多類型替換會變得令人困惑!
你確實應該使用'using'。 – Rakete1111
@ Rakete1111:是嗎?你能舉個例子嗎? – infoclogged
不要使用「下劃線大寫」 [https://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-a-c-identifier。就個人而言,我不喜歡看到任何前導下劃線,因爲它使得用戶代碼看起來像系統頭文件,但隨着C++被python化,我越來越多地看到它。 –