【问题标题】:Typedef of structs结构的类型定义
【发布时间】:2010-10-07 14:58:06
【问题描述】:

我在我的项目中以这种方式使用结构:

typedef struct
{
    int str1_val1;
    int str1_val2;
} struct1;

typedef struct
{
    int str2_val1;
    int str2_val2;
    struct1* str2_val3;
} struct2;

我是否有可能以某种方式破解这个定义,我只会在我的代码中使用类型,比如

struct2* a;
a = (struct2*) malloc(sizeof(struct2));

不使用关键字struct?

【问题讨论】:

  • 我不确定你的问题是什么,你能详细说明你想要完成什么吗?我会把最后一行写成a = malloc(sizeof *a);
  • 我解决了这个问题,我正在使用 typechange,因为在我的系统上有一个叫做 calloc1 的原始函数(是的,这是正确的)并且它返回 char*,但这没关系
  • 那么你应该用一个返回void *的函数来包装这个不正常的calloc1函数(或者只使用一个宏来执行此操作)。
  • 永远不要对malloccallocrealloc返回的值进行类型转换。它的可读性较差,唯一能产生影响的方法是如果你忘记了#include <stdlib.h>,在这种情况下你会想知道你忘记了它。

标签: c struct typedef


【解决方案1】:

是的,如下:

struct _struct1
{
...
};
typedef struct _struct1 struct1;

struct _struct2
{
...
};
typedef struct _struct2 struct2;

...

struct2 *a;
a = (struct2*)malloc(sizeof(struct2));

【讨论】:

  • 那么可能是另一个文件的问题。因为这段代码看起来是正确的。
  • 我知道我明白了,问题出在在此之前声明的其他 h 文件中,同样的“错误方式”
  • 去掉结构标签中的下划线。它们是不必要的,如果滥用会导致错误。
【解决方案2】:

是的,你可以使用 typedef 的符号而不需要 struct 关键字。编译器只是将该名称用作您之前定义的结构的别名。

关于您的示例的一个注释,malloc 返回一个指向内存的指针。因此你的陈述应该是

a = (struct2 *)malloc(sizeof(struct2));

【讨论】:

  • @ralu:那么重点是什么?这看起来像是您提出的问题的答案;你想问什么?
【解决方案3】:

只是为了分享,我见过这种方法,虽然我个人不喜欢它(我喜欢所有命名和标记为 =P 的东西,我不喜欢在 malloc 中使用变量名),但有人可能会。

typedef struct {
    ...
} *some_t;

int main() {
    some_t var = (some_t) malloc(sizeof(*var));
}

【讨论】:

  • _t 名称保留用于实现
【解决方案4】:

作为脚注。如果你用 C++ 编码,那么你不需要做 typedef;结构体自动成为类型。

【讨论】:

    猜你喜欢
    • 2011-04-15
    • 2014-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-03
    • 2019-12-28
    • 1970-01-01
    • 2018-09-26
    相关资源
    最近更新 更多