在函数的原型和C中的定义中都需要static关键字吗?

时间:2018-11-21 09:05:28

标签: c static

我读过this post,如何在C语言中的函数中使用static说明符,但是我不明白是否有必要在函数的原型和定义中都使用它,或者可以将其省略定义。例如,在这种情况下:

static void foo(void);

void foo() {...}

foo仅是内部链接还是这样的用法不正确?

3 个答案:

答案 0 :(得分:2)

  

foo是否仅是内部链接或此类用法不正确?

6.2.2 Linkage of identifier状态:

  

对于在可见该标识符的先前声明的范围内用存储类说明符extern声明的标识符,31)如果该先前声明指定了内部或外部链接,则该标识符在后面的声明中的链接为与先前声明中指定的链接相同。

foo定义具有外部链接时(如果没有明确指定,则函数具有外部链接 1 ),此时,存在foo的先前声明。内部链接可见。因此foo具有内部链接。

1

  

如果函数的标识符声明没有存储类说明符,则其链接的确定与使用存储类说明符extern声明时完全相同。如果对象标识符的声明具有文件范围并且没有存储类说明符,则其链接是外部的。

答案 1 :(得分:1)

在C中,整个函数具有默认的外部链接。如果对函数使用static关键字。它将链接从外部链接更改为内部内部链接。您可以使用“ static”关键字使该函数仅可用于其中定义的文件。仅此而已。

static void foo(void); // internal linkage

void foo(void);        // external linkage

答案 2 :(得分:0)

您的用法完全可以。 foo仅在当前正在编译的源文件中是已知的。