【问题标题】:Warning-free Templating in CC中的无警告模板
【发布时间】:2010-10-12 13:05:41
【问题描述】:

从 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;
}

同样,问题在于此代码的 warning free 编译——即使用 gcc 编译器,尽管我的 wxDevCpp for Windows 也给了我一些警告,但对它不那么挑剔。我把它归咎于 GUI。

任何帮助将不胜感激。

【问题讨论】:

  • 如果可能的类型有限,你可以使用一个大联合(如果你想指向一个结构,它仍然可以包含一个空指针)。或者您可以使用一个字节向量(例如 unsigned char [8]),它的大小足以存储任何可能的数据类型,并使用 memcpy 来存储数据并从中获取数据)。
  • 什么时候值得使用工会?我还不清楚。

标签: c data-structures casting templating gcc-warning


【解决方案1】:

对我来说,只需为 malloc (&lt;stdlib.h&gt;) 添加正确的包含,就可以使您的代码编译时无警告:gcc -std=c89 -Wall -Wextra -pedantic

【讨论】:

    【解决方案2】:

    malloc 是在 stdlib.h 中声明的,但您没有包含该文件。因此,如果您添加 #include,警告就会消失。

    另一个警告是关于//,它在 C89 中不是有效的注释。要消除该警告,请对 cme​​ts 使用 /* */ 或告诉 gcc 使用 C99。

    【讨论】:

    • 谢谢大家。我为自己的语法感到非常自豪,现在我觉得自己很迟钝;P
    • 我会说“声明在”而不是“定义在”,声明对用户程序员来说很重要。
    猜你喜欢
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 2018-02-10
    • 1970-01-01
    • 2017-08-19
    • 1970-01-01
    • 2015-07-15
    • 2014-04-06
    相关资源
    最近更新 更多