C 函数原型范围内的声明点

Ton*_*y L 0 c scope function-prototypes

在 C 函数原型范围内声明形式参数有什么意义?

\n

从我自己的测试来看,原型范围中形式参数的声明点似乎遵循从左到右的顺序(参数名称按从左到右的顺序在原型范围内可见),但我不是当然。您能解释一下这一点或指出我正确的地方吗?

\n

案例1:gcc对c99标准没有投诉

\n
int sum(int n, int a[n]); \n
Run Code Online (Sandbox Code Playgroud)\n

情况 2:来自带有 c99 标准的 gcc 的“错误:\xe2\x80\x98n\xe2\x80\x99 此处未声明(不在函数中)”

\n
int sum(int a[n], int n);\n
Run Code Online (Sandbox Code Playgroud)\n

上述两种情况都放置在文件作用域下,文件作用域中没有名为 n 的变量。

\n

Eri*_*hil 5

C 标准没有定义 \xe2\x80\x9c 声明点。\xe2\x80\x9d 它定义了scope ,它是程序文本中可见(可以使用)的区域(C 2018 6.2.1 2 )。

\n

C 2018 6.2.1 7 说:

\n
\n

\xe2\x80\xa6 任何其他标识符[前面的文本涵盖结构/联合/枚举标记和枚举常量]的作用域在其声明符完成之后开始。

\n
\n

因此,在 中int sum(int n, int a[n]);, 的范围从n开始,, 的范围从a开始)(因为[n]是其声明符的一部分)。

\n

int sum(int a[n], int n);, 的范围n还没有开始a[n]出现在哪里。

\n

奖金

\n

请注意,在此代码中,参数的范围a直到 after 才开始int (*a)[a],因此ain[a]引用了 previous a,并且程序打印 \xe2\x80\x9c*a's type has 3 elements.\xe2\x80\x9d:

\n
#include <stdio.h>\n\n\nint a = 3;\n\n\nstatic void f(int (*a)[a])\n{\n    printf("*a's type has %zu elements.\\n", sizeof *a / sizeof **a);\n}\n\n\nint main(void)\n{\n    f(0);\n}\n
Run Code Online (Sandbox Code Playgroud)\n