Ton*_*y L 0 c scope function-prototypes
在 C 函数原型范围内声明形式参数有什么意义?
\n从我自己的测试来看,原型范围中形式参数的声明点似乎遵循从左到右的顺序(参数名称按从左到右的顺序在原型范围内可见),但我不是当然。您能解释一下这一点或指出我正确的地方吗?
\n案例1:gcc对c99标准没有投诉
\nint sum(int n, int a[n]); \nRun Code Online (Sandbox Code Playgroud)\n情况 2:来自带有 c99 标准的 gcc 的“错误:\xe2\x80\x98n\xe2\x80\x99 此处未声明(不在函数中)”
\nint sum(int a[n], int n);\nRun Code Online (Sandbox Code Playgroud)\n上述两种情况都放置在文件作用域下,文件作用域中没有名为 n 的变量。
\nC 标准没有定义 \xe2\x80\x9c 声明点。\xe2\x80\x9d 它定义了scope ,它是程序文本中可见(可以使用)的区域(C 2018 6.2.1 2 )。
\nC 2018 6.2.1 7 说:
\n\n\n\xe2\x80\xa6 任何其他标识符[前面的文本涵盖结构/联合/枚举标记和枚举常量]的作用域在其声明符完成之后开始。
\n
因此,在 中int sum(int n, int a[n]);, 的范围从n开始,, 的范围从a开始)(因为[n]是其声明符的一部分)。
中int sum(int a[n], int n);, 的范围n还没有开始a[n]出现在哪里。
请注意,在此代码中,参数的范围a直到 after 才开始int (*a)[a],因此ain[a]引用了 previous a,并且程序打印 \xe2\x80\x9c*a's type has 3 elements.\xe2\x80\x9d:
#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}\nRun Code Online (Sandbox Code Playgroud)\n