2012-02-27 56 views
1

我發現在C以下語法++源文件(沒有標頭):不太得到的是:uintptr_t的值(astruct.val)

template <typename Type_> static void aFunction(Type_ &function, ...) { 
    uintptr_t value(astruct.val); //confusing 
} 

是,有關的價值宣言混亂線?我試着寫像一個Hello World程序:

int main(){ uintptr_t a(80); return 0;} 

,並返回數字常量之前預期的聲明說明符或「...」,可我知道那有什麼困惑行嗎?謝謝!

編輯:我想我應該展示完整的函數聲明:

template <typename Type_> 
static void nlset(Type_ &function, struct nlist *nl, size_t index) { 
    struct nlist &name(nl[index]); 
    uintptr_t value(name.n_value);// this is the confusing line 
    if ((name.n_desc & N_ARM_THUMB_DEF) != 0) 
     value |= 0x00000001; 
    function = reinterpret_cast<Type_>(value); 
} 
+0

錯誤是什麼? 「astruct」從哪裏來的?它的類型是什麼? – 2012-02-27 10:22:25

+0

你期望會發生什麼?你的代碼會打印你好世界? – CashCow 2012-02-27 10:23:05

+0

'uintptr_t'被定義爲一個無符號整數,保證它與指針具有相同的大小。你忘了包含''(C++ 03)嗎? – Zeta 2012-02-27 10:27:24

回答

1

uintptr_t的是無符號整數(至少)一個指針的大小。

它不是一個原生型,雖然,你需要包括<stdint.h><cstdint>

真的是「邪惡的」投指向整數,並將其作爲整體的變數,但是有很多的「遺留」的代碼那就是依賴於它,所以你需要一個足夠大的int大小來存儲它。

將它們存儲爲整數允許您「安全地」對整型數據進行操作,但不能使用指針進行操作,比如在不屬於同一範圍時進行比較,以便在內存泄漏檢查器中使用它們等

+1

uintptr_t是一個無符號整數memsize類型,可以安全地存儲指針,而不管平臺容量。類型uintptr_t類似於size_t和UINT_PTR類型,類型的大小取決於數據模型 – steveoh 2012-02-27 10:23:16

+0

根據什麼標準,steveoh?uintptr_t不是C++的標準類型 – CashCow 2012-02-27 10:30:50

+0

我看到它是一個unsigned int的大小一個指針 – CashCow 2012-02-27 10:32:19

2

如你所知,std::uintptr_t是標頭<cstdint>(自C++ 11以來)的標準類型。

你不明白該生產線是一個簡單的變量聲明+定義:

uintptr_t value(name.n_value); 

聲明一個名爲uintptr_tvalue變量並與name.n_value值初始化。對於基本類型,這相當於:

uintptr_t value = name.n_value; 

我試着寫一個Hello World程序,如:

int main(){ uintptr_t a(80); return 0;} 

並返回一個錯誤[...]

什麼錯誤?始終發佈您收到的錯誤消息,沒有人可以幫助您處理「我遇到了錯誤」!

我懷疑你得到的錯誤是由於uintptr_t沒有定義,除非你包括<cstdint>,然後你應該使用std命名空間前綴。

+0

感謝您的回覆,但我得到的錯誤是: 預期聲明說明符或'...'之前數字常量 – gigasai 2012-02-27 11:04:01

+0

好吧,我明白了,費迪南德是對,但最重要的是,我用gcc而不是g ++來編譯我的簡單程序。謝謝你的回覆!我想知道爲什麼c編譯器拋出在相同的int a(80);語法.. – gigasai 2012-02-27 11:18:22

+0

@LeeWangHao:構造器樣式的初始化是一個C++特性,並且不是有效的C,因此在使用C編譯器時會出錯。 – 2012-02-27 11:50:16

相關問題