2010-10-12 49 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