声明“int t [0];”的目的是什么?服务?

时间:2012-06-05 12:14:19

标签: c c99

以下声明的目的是什么?

struct test
{
     int field1;
     int field2[0];
};

3 个答案:

答案 0 :(得分:7)

这只是一个0长度数组。根据{{​​3}}:

  

在GNU C中允许使用零长度数组。它们非常有用   结构的最后一个元素,它实际上是一个标题   变长对象:

 struct line {
   int length;
   char contents[0];
 };

 struct line *thisline = (struct line *)
 malloc (sizeof (struct line) + this_length);
 thisline->length = this_length;

答案 1 :(得分:3)

这是一个零大小的数组,如果您没有C99,这是一个有用的GCC extension

答案 2 :(得分:0)

这是封装。

它用于在不知道任何细节的情况下创建界面。 以下是一个简单的例子。

在test.h(接口)中,它显示有一个struct test_t,它有两个字段。 它有三个功能,第一个是创建结构。 set_x是将一些整数存储到结构中。 get_x是获取存储的整数。

那么,我们什么时候可以存储x?

负责实现的人(test.c)将声明另一个包含x的结构。 并将“test_create”中的一些技巧用于malloc这个结构。

完成界面和工具后。 应用程序(main.c)可以在不知道它的位置的情况下设置/获取x。

test.h

struct test_t
{
    int field1;
    int field2[0];
};

struct test_t *test_create();
void set_x(struct test_t *thiz, int x);
int get_x(struct test_t *thiz);

test.c的

#include "test.h"
struct test_priv_t {
    int x;
};

struct test_t *test_create()
{
    return (struct test_t*)malloc(sizeof(struct test_t) + sizeof(struct test_priv_t);
}


void set_x(struct test_t *thiz, int x)
{
    struct test_priv_t *priv = (struct test_priv_t *)thiz->field2;
}

int get_x(struct test_t *thiz)
{
    struct test_priv_t *priv = (struct test_priv_t *)thiz->field2;
}

的main.c

#include "test.h"

int main()
{
    struct test_t *test = test_create();
    set_x(test, 1);
    printf("%d\n", get_x(test));
}