Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 不匹配的过程声明和定义_C_Gcc - Fatal编程技术网

C 不匹配的过程声明和定义

C 不匹配的过程声明和定义,c,gcc,C,Gcc,生成静态范围的“foo”,而如果将“static”从声明移动到定义,则会出现错误。我不能用谷歌的问题来说明我的理由,但对我来说这似乎不合理 有人有见解吗?链接器需要函数声明才能通过转换单元解析调用。所以,若函数被声明为静态的,那个么在翻译单元之外就无法访问它 如果将函数声明为非静态,并定义为静态,则会出现错误,因为声明和定义不匹配,但名称相同。想象一下函数声明可能位于标题中的典型情况。如果你声明函数不是静态的,你告诉编译器“这个函数在这个翻译单元之外可用”。然后,该功能被定义为“仅在该翻译单元中

生成静态范围的“foo”,而如果将“static”从声明移动到定义,则会出现错误。我不能用谷歌的问题来说明我的理由,但对我来说这似乎不合理


有人有见解吗?

链接器需要函数声明才能通过转换单元解析调用。所以,若函数被声明为静态的,那个么在翻译单元之外就无法访问它


如果将函数声明为非静态,并定义为静态,则会出现错误,因为声明和定义不匹配,但名称相同。

想象一下函数声明可能位于标题中的典型情况。如果你声明函数不是静态的,你告诉编译器“这个函数在这个翻译单元之外可用”。然后,该功能被定义为“仅在该翻译单元中可见”,这当然永远不会起作用

另一方面(你写它的方式),你的声明是说“这个函数在这个单元之外是不可用的”,定义是“顺便说一下,这个函数在这里”。事实上,定义中没有说静态是无关紧要的


诚然,强制声明和定义之间的“静态性”相同会更有意义,但我认为它仍然是这样工作的。

lint
也会在这里发出警告。在两个声明中都放置
static
。这样做最有意义。问题在于寻找一个让它与众不同的理由。我无意中遇到了一个环境,“静态”通常只应用于声明,而不应用于定义。这个问题的产生是因为我惊讶地发现它是合法的,并且使程序具有静态范围。
static void foo(void);

[.....]

void foo(void) {
    .....
}