C语言 静态数组索引可以与不透明的结构类型使用吗?



我想为一个不透明的结构重写一个函数:

// Set.h
typedef struct Set Set;
void Set_Function(Set* self);

我想修改这个函数,向开发人员表明不允许使用等于(void*) 0的指针:

void Set_Function(Set self[static 1]);

但是Clang抱怨我有一个不完整的数组类型

这个功能是否可行,或者我必须保持原来的函数声明和手动检查(void*) 0指针?

为评论中的人编辑:

Jens Gustedt的Modern C在第204页建议如下:

接收指针的函数应该使用数组语法,并区分不同的情况:

  • 指向该类型的单个对象的指针-这些函数应该使用静态1表示法,从而表明它们期望指针是非空的:void func ( double a[ static 1]) ;
  • 指向已知数目的对象集合的指针——这些函数应该使用静态N表示法,从而表明它们期望指针至少指向该数目的元素:void func ( double a[ static 7]) ;
  • 指向未知数量对象集合的指针-这些函数应该使用VLA符号:void func ( size_t n, double a[n]) ;
  • 指向该类型的单个对象的指针或空指针——这样的函数必须保证即使接收到空指针,执行仍保持在已定义的状态:void func ( double * a) ;

编译器构建器只开始实现对这些情况的检查,因此您的编译器可能还不会检测到此类错误。然而,把这些写下来,并让自己清楚,将有助于你避免越界错误。

有几点需要考虑:

  • 将输入参数设置为数组通常为:void Set_Delete(Set self[]);。但这在未来的使用中会有一定的限制。
  • 检查输入是每个人做的正常方法。

最新更新