我想为一个不透明的结构重写一个函数:
// 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[]);
。但这在未来的使用中会有一定的限制。 - 检查输入是每个人做的正常方法。