如果无法保证参数的评估顺序,编译器如何知道数组的维数

Agr*_*cus 6 c

我的代码是:

//fun FUNCTION
void fun(int D1, int D2, int arr[D1][D2]) 
{
    //FUNCTION BODY
}


//MAIN FUNCTION

int D1, D2;
int arr[][3]=//VALUES
D2=sizeof(arr[0])/sizeof(a[0][0]);
D1=sizeof(arr)/sizeof(a[0]);

fun(D1,D2,arr);
Run Code Online (Sandbox Code Playgroud)

如果arr函数的参数顺序不确定,编译器将如何知道函数fun中数组的维数?

Eri*_*hil 3

C 标准没有指定参数求值的顺序。但是,所有参数都会在调用函数之前进行评估。Per C 2018 6.5.2.2 10(讨论函数调用):

在函数指示符和实际参数的求值之后但在实际调用之前有一个序列点。

因此,当被调用函数开始执行时,所有参数都已被求值,因此它们的值是已知的。然后根据 6.9.1 10(讨论函数定义)评估可变修改参数的大小表达式:

在进入该函数时,将评估每个可变修改参数的大小表达式,并将每个参数表达式的值转换为相应参数的类型,就像通过赋值一样。

(请注意,参数是调用者传递给函数的内容,参数是作为函数声明或定义的一部分声明的对象,它们在进入函数时获取值。)