2010-07-16 190 views
4

我想提供一種元素作爲參數的類型的指針數組的初始化一個未知的類型的元件typeof的返回類型是什麼?

類似

void* init(type t) 
    void* array = malloc(sizeof_type(t)*10)); 
    return array; 
} 

和以後調用例如

init(typeof(int)) 

但我無法確定typeof的返回類型是什麼。

我想可以用

malloc((type) 0); 

在此先感謝

PS可以實現sizeof_type想:這如果一個矢量implementatin如果有人能指出我的一些flexiblecode我將非常感激,以及

+0

這應該是重新標記,這看起來並不像C在所有 – 2010-07-16 14:11:40

+0

也許這將幫助:http://www.redhat.com/docs/manuals/enterprise/RHEL-4-Manual/gcc/typeof.html也可能是這樣的:http://www.accu-usa.org /Listings/2000-05-Listing01.html – FrustratedWithFormsDesigner 2010-07-16 14:12:49

+0

我會非常謹慎的使用typeof(),除非我確定我希望我的程序只能在GNU上工作。 – Uri 2010-07-16 14:15:08

回答

3

我通常不使用GNU(我認爲這僅僅是GNU C),但我不認爲這是通常意義上的表達,你可以將它的值賦給一個變量並稍後使用它。我認爲它只能在非常特定的環境中作爲一種類型使用。

From the docs:

使用該關鍵字 sizeof相似的的語法,但構建物 語義行爲像用typedef定義的類型名稱 。

可以使用typeof構造可以使用 任何地方可以使用typedef名稱。 例如,您可以在 聲明中,在演員表中或 sizeof或typeof中使用它。

+1

好學我可以做'typeof(typeof(typof(typeof(c))))',它和'typeof(c)';-)一樣 – kriss 2010-07-16 14:24:15

+0

謝謝所以這可能是不可能的。這基本上意味着我必須提供原型數據元素,而不是類型 – Ingo 2010-07-16 15:06:56

2

你想要什麼是不可能的。

typeof()並不真的返回一個類型,因爲它是一個關鍵字,它在編譯時處評估。它由其參數類型的名稱取代。

也許你可以不能使用字符串化操作的預處理,使其一個字符串,像這樣## typeof運算(一),但後來它仍然是不可能的malloc /施放的東西時,你有一個字符串的類型。

+0

1.字符串化不起作用,因爲在預處理階段無法評估typeof()。你會得到只是你的麻煩字符串「typeof(a)」。 – atzz 2010-07-16 14:20:26

+0

2.「##」實際上是標記粘合,而不是字符串化。 – atzz 2010-07-16 14:21:23

+0

+1。並刪除最後一段,沒有任何意義。從你所說的typeof()在編譯時估計,那麼對於預處理技巧來說就太晚了。 – Dummy00001 2010-07-16 15:03:06

1

此:

#define INIT(t) (malloc(sizeof(t) * 10)) 

可以使用這樣的:

int* a = INIT(int); 

或可能是這樣的:

void* b = INIT(typeof(c)); 

甚至這樣的:

void* b = INIT(c); 

sizeof(c) == sizeof(typeof(c))

+1

甚至'void * b = INIT(c)'作爲'sizeof'接受一個變量(就像有一個隱含的'typeof'一樣工作) – kriss 2010-07-16 14:22:28

+0

@kriss:well spotted :) – 2010-07-16 14:24:41

4

爲什麼你不能只使用sizeof? 類似:

int c; 
void *p = calloc(10,sizeof(c)); 
0

您可以使用宏用於此目的:

#define INIT(t) ((t*) init_1(sizeof(t))) 

void *init_1(size_t sz) { 
    void *array = malloc(sz * 10); 
    return array; 
} 

然後你使用像:

int *array = INIT(int); 
+0

沒有理由來施放結果。只需使用'void *'來實現它的目的。 (參見鑄造被認爲有害的malloc的返回值。) – 2010-07-17 20:08:07

+1

@R ..在這種情況下你錯了。仔細看看,我**不是**施放malloc()的返回值,所以您的擔心不適用於此。我正在轉換init_1()的返回值,以便表達式具有適當的類型。這很重要,例如,編譯器會標記錯誤,例如將'INIT(int)'分配給'char *'。在malloc()返回中不使用強制類型轉換的目的是爲了防止編譯器使用返回int的隱式malloc()聲明,並將其轉換爲指向UB的指針類型。 – Juliano 2010-07-18 02:21:51

+0

請注意,因爲我實際上並不投射malloc()的返回值,所以如果用戶忘記包含,則編譯器將發出警告,將int轉換爲malloc()行中的指針。 #define行中的類型轉換是無害的,因爲init_1()的定義存在,編譯器知道該函數返回一個指針,並且該轉換會執行指向轉換指針的安全指針,並使表達式具有正確的類型。 – Juliano 2010-07-18 02:26:15

相關問題