2013-10-25 144 views
2

簡單問題:C/C++改變定義一個變量

如何改變的#define TIMER_MAX 0xFFFF的;成一個const變量?我不確定使用什麼類型。這是一個字節嗎?

感謝

+0

這是兩個字節,所以也許 - 'uint16_t TIMER_MAX = 0xFFFF的;' – 0x499602D2

+0

或者只是詮釋。取決於它所用的上下文我會說。 –

+1

如果它在'int'之前工作得很好,不妨將它保存爲'int'。 – bstamour

回答

3
const unsigned TimerMax = 0xFFFF; 

應該做的很好。除非你需要TimerMax是一個具體大小。

+2

如果你的int是隻有16位(這是由標準允許的),然後呢?你必須至少使它成爲一個unsigned int。 – sfstewman

+0

@sfstewman:很對,編輯,謝謝。 –

6

它需要字節,uint16_t適合:

#include <cstdint> 

const uint16_t TimerMax = 0xFFFF; 
+0

我唯一不同的做法是將其標記爲'constexpr',以便在需要時可用於編譯時編程。 – bstamour

+3

@bstamour:從常量表達式初始化的標記爲'const'的標量變量是常量表達式。 –

+0

@ BenjaminLindley在C++中這是真實的,但我不相信它是用於C的,並且這個問題被標記爲兩個。當然,C沒有'constexpr'修飾符。 – sfstewman

0

你不能改變一個#define宏觀到一個變量,無論是const與否。宏和變量聲明屬於編譯過程的兩個完全不同的階段。宏由預處理器擴展,而變量在語義分析代碼時分配。所以,只有在你真正瞭解你所在的代碼的情況下才能這樣做。

+0

#defines常常被用作全局常量值,這些值不會被任何其他預處理器表達式引用。因此,您可以將它們替換爲常量變量,並且在這些情況下,實際上建議這樣做。 –

+1

OP在編寫代碼(我認爲)時想改變它。所以他可以刪除宏並放入其他東西。 – deepmax

0

這將是2個字節,所以一個短。

如下您可以定義它:

const unsigned short TimerMax = 0xFFFF; 
0

你可以只使用一個char(1個字節)或短(2個字節)兩種尺寸取決於機實現雖然,如果你宣佈它在十六進制想。

unsigned short hex_num = 0xFFFF; // 0xFFFF is 2 bytes 
3

這不是一個字節。一個字節有8位,因此支持0-255的無符號值。

值0xFFFF至少需要一個16位的值。我會做這個成枚舉常量,讓編譯器選擇合適的尺寸:

enum { TimerMax = 0xFFFF }; 

這具有將被視爲一個編譯時在C和C++常量的優點。此外,無論更好還是更壞,保持宏的屬性,你不能把內存位置TimerMax

這比使用一個const變量可以說的可讀性,但它在C這樣一個常見的成語,我不覺得這是一個問題。