2010-10-12 63 views
0

從C++過渡到現在,我正在學習C的黑暗藝術,並開發了以下代碼來取代我對模板的需求。在底部的例子中,我已經實現了你的花園式的Node結構,它可以用來存儲任何數據類型。考慮以下...C中的無警告模板C

// vptr.c 
#include <stdio.h> 

struct Node 
{ 
    void* data; 
    struct Node* next; 
}; 

int main() 
{ 
    struct Node n0, n1; 

    n0.next = &n1; 
    n0.data = malloc(sizeof(int)); 

    *((int*) n0.data) = 3; 

    printf("%d\n", *((int*) n0.data)); 

    return 0; 
} 

同樣,問題在於警告這段代碼的免費編譯 - 即使用gcc編譯器,雖然我的wxDevCpp的Windows也給了我一些警告,但挑剔的要少得多關於它。我把它歸咎於GUI。

任何幫助將不勝感激。

+0

如果可能的類型是有限的,你可以使用一個大的聯合(如果你想指向一個結構,它仍然可以包含一個void-pointer)。或者你可以使用一個字節向量(例如unsigned char [8]),它足夠大以存儲任何可能的數據類型,並使用memcpy存儲數據並進行轉換以從中獲取數據。 – Patrick 2010-10-12 13:12:34

+0

工會值得使用嗎?這對我仍然不清楚。 – 2010-10-12 13:28:07

回答

2

對於我來說,只需爲malloc(<stdlib.h>)添加正確的include即可讓您的代碼免費編譯爲:gcc -std=c89 -Wall -Wextra -pedantic

2

malloc在stdlib.h中聲明,您不包括它。所以如果你添加#include,警告就會消失。

另一個警告是關於//這不是C89中的有效評論。要使警告消失,請使用/* */進行註釋,或告訴gcc使用C99。

+0

謝謝你們。我爲自己的語法感到自豪,現在我覺得遲緩; P – 2010-10-12 13:21:00

+0

我會說「聲明」而不是「定義在」中,聲明對用戶程序員來說很重要。 – Arun 2010-10-12 16:39:16

+0

@阿倫:是的,你完全正確。修復。 – sepp2k 2010-10-12 16:40:52