我应该声明作为函数参数传递的数组的预期大小吗?

Seb*_*oll 3 c

我认为两者都是有效的C语法,但哪个更好?

一个)

void func(int a[]);  // Function prototype
void func(int a[]) { /* ... */ }  // Function definition
Run Code Online (Sandbox Code Playgroud)

要么

B)

#define ARRAY_SIZE 5
void func(int a[ARRAY_SIZE]);  // Function prototype
void func(int a[ARRAY_SIZE]) { /* ... */ }  // Function definition
Run Code Online (Sandbox Code Playgroud)

Chr*_*oph 6

添加数组大小的主要原因是出于文档目的.此外,使用C99,您可以在方括号内添加限定符,这些限定符将用于修改数组声明将在参数列表中发生时将转换为的指针声明.

参见C99规范,第6.7.5.3节,第7节:

参数声明为''类型数组''应调整为''限定指向类型'',其中类型限定符(如果有)是在数组类型派生的[和]中指定的那些.如果关键字static也出现在数组类型派生的[和]中,那么对于每次对函数的调用,相应的实际参数的值应提供对数组的第一个元素的访问,其中至少有指定的元素数量.按大小表达式.

和§21:

例5以下是所有兼容的函数原型声明符.

double maximum(int n, int m, double a[n][m]);
double maximum(int n, int m, double a[*][*]);
double maximum(int n, int m, double a[ ][*]);
double maximum(int n, int m, double a[ ][m]);
Run Code Online (Sandbox Code Playgroud)

就好像:

void f(double (* restrict a)[5]);
void f(double a[restrict][5]);
void f(double a[restrict 3][5]);
void f(double a[restrict static 3][5]);
Run Code Online (Sandbox Code Playgroud)

(注意,最后一个声明还指定在对f的任何调用中对应于a的参数必须是指向至少三个5个双精度数组中的第一个的非空指针,而其他数组则不是.)


Ara*_*raK 4

实际上,这没有什么区别,因为无论如何尺寸都会丢失。