C 夹板警告的含义是什么?我可能做错了什么?

C 夹板警告的含义是什么?我可能做错了什么?,c,linux,gcc,splint,C,Linux,Gcc,Splint,这是代码行: bool cpfs_utimens(struct Cpfs *, char const *path, struct timespec const[2]); 运行splint 3.1.2会生成以下警告: cpfs.h:21:74: Function parameter times declared as manifest array (size constant is meaningless) A formal parameter is dec

这是代码行:

bool cpfs_utimens(struct Cpfs *, char const *path, struct timespec const[2]);
运行splint 3.1.2会生成以下警告:

cpfs.h:21:74: Function parameter times declared as manifest array (size
                 constant is meaningless)
  A formal parameter is declared as an array with size.  The size of the array
  is ignored in this context, since the array formal parameter is treated as a
  pointer. (Use -fixedformalarray to inhibit warning)

命名参数没有区别。

这意味着当您声明参数
struct timespec const[2]
时,
[
]
之间的
2
不是必需的。将代码更改为:

bool cpfs_utimens(struct Cpfs *, char const *path, struct timespec const[]);
在C/C++中,您不能要求将某个大小的数组作为参数,因为数组被视为指针,指针没有大小。

在C99中(因为您使用
bool
),您可以通过这样添加
static
来要求参数数组的最小长度

bool cpfs_utimens(struct Cpfs *, char const *path, struct timespec const[static 2]);
我想,签名(如果C中有这样的东西)仍然是指针参数的签名


(而且我还不知道任何现有的编译器能够从这些信息中做出合理的操作。)

如果您想按值传递,您可以将其包装在
结构中
@Matt:参见示例。您也不能按值返回数组。@马特:声明返回类型为数组类型的函数是非法的-即使不是,您也无法成功地将数组传递给
return
,因为它总是会衰减为指向其第一个元素的指针。@Jack Kelly重新撇号nit。。。既然你问了,那么这种nit的解决方法就是(借用著名维基的一句话)大胆一点,如果你有足够的代表来编辑它,就去修改它。如果没有,耐心通常会产生一个有足够代表性的用户来修复它。通过这种方式,大多数损坏的窗口都可以得到修复,而不会有太多的麻烦。您询问的C99参考是第6.7.5.3/1条(禁止使用数组类型的返回类型)和第6.7.5.3/7条(数组类型的参数更改为指针类型)@Matt Joiner:至少
gcc
实现了语法部分;-)我想,这方面的真正考验很难实现。您要么必须在指针上处理某种不变量(
大于
),要么严格限制为正确大小的数组对象。