【问题标题】:Does a static function need the static keyword for the prototype in C?静态函数是否需要 C 中原型的 static 关键字?
【发布时间】:2013-03-18 04:37:39
【问题描述】:

我的C编程书上说,当我想创建一个静态函数时,我需要把static关键字放在函数前面定义。它没有明确提及原型的任何内容。此外,这些示例不使用原型,只是将静态函数放在文件的顶部(因此它们不需要我假设的原型)。

那么,静态函数是否需要原型的 static 关键字?还是我把它放在定义前面?

【问题讨论】:

  • 你试过编译void foo(); static void foo() { }吗?
  • 不在我现在可以编译的电脑前。另外,我注意到在编程中,仅仅因为它在一个示例中有效,并不意味着它可以在 所有案例。
  • 当你可以要求 SO 为你做时,为什么要自己做?
  • @w1res 虽然在某些情况下确实如此,但这不是其中之一。如果你能找到一个允许你在声明中省略 static 修饰符的编译器,我会印象深刻
  • 一个有趣的问题。我想知道为什么它得到了反对票。

标签: c static-functions


【解决方案1】:

是的,是的,您确实需要在声明前加上 static。

将其输入 ideone.com

int add();
int main(){
    printf("%d",add());
    return 0;
}

static int add(){
    return 1+1;
}

你会得到这个结果:http://ideone.com/VzZCiE

现在输入这个

static int add();
int main(){
    printf("%d",add());
    return 0;
}

static int add(){
    return 1+1;
}

你得到这个:http://ideone.com/sz8HVR

【讨论】:

  • 怎么错了?如果省略静态,它将失败。即使您认为它适用于某些编译器,它也不适用于所有编译器。你真的想在可以避免的情况下鼓励编译器特定的代码吗?
  • 您在我的回答中看到了示例?它们包含没有静态的原型,但它们是正确的,并且可以被每个 C 编译器编译。不过,我不想鼓励这样做。
【解决方案2】:

没有。一个函数声明(原型甚至定义)可以省略关键字static,如果它跟在另一个使用static的函数声明之后。

如果一个函数有一个static 声明,它的第一个声明必须是static

在 ISO/IEC 9899:1999, 6.7.1 中定义:

如果 [...] 函数的文件范围标识符的声明包含存储类说明符 static,则该标识符具有内部链接。

[...]

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

[...]

如果函数标识符的声明没有存储类说明符,则它的链接将完全确定,就好像它是使用存储类说明符 extern 声明的一样。

[...]

如果在翻译单元内,相同的标识符同时出现在内部和外部链接中,则行为未定义。

所以,例如这是有效的:

static void foo(void);
void foo(void);
static void foo(void) { }

这个也是:

static void foo(void) { }
void foo(void);

static void bar(void);
void bar(void) {}

但是这段代码不正确:

void foo(void);
static void foo(void) { }

通常你会并且应该在原型中也有static(因为它们通常是第一个出现的)。

【讨论】:

  • static void foo(void) 与 void foo(void) 不同,不是吗?两个不同的声明?
  • 不,这只是同一个函数的冗余声明。
  • +1: 并提醒:函数定义用作原型;原型用作声明。
  • 关键要点:“通常你会并且应该在原型中也有静态(因为它们通常首先出现)。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-22
  • 2021-08-04
  • 1970-01-01
  • 1970-01-01
  • 2015-08-25
  • 1970-01-01
  • 2021-06-21
相关资源
最近更新 更多