繁体   English   中英

函数声明中的静态关键字在函数定义中可能会丢失吗?

[英]Static keyword in function declaration can be missing in function definition?

我希望有一个静态函数,我在定义之前在我的.c文件中声明:

//file a.c version 1
static int foo();
...
static int foo()
{
...
}

但是,似乎我可以将static关键字从函数定义中删除,并且我没有得到编译器警告......例如

//file a.c version 2
static int foo();
...
int foo()
{
...
}

假设这两种形式完全相同,我是否正确?
如果是这样,为什么允许这种差异,我应该使用哪种形式?

是7.1.1 / 6

在没有存储类说明符的命名空间范围内声明的名称具有外部链接,除非由于先前的声明而具有内部链接,并且未将其声明为const

另见7.1.1 / 7的示例

7.1.1 / 7:

连续声明对特定实体所暗示的联系应予以同意。 也就是说,在给定范围内,声明相同对象名称或函数名称相同重载的每个声明都应表示相同的链接。

7.1.1 / 6 :(谢谢史蒂夫 - 这也是需要澄清的答案)

在没有存储类说明符的命名空间范围内声明的名称具有外部链接,除非由于先前的声明而具有内部链接,并且未将其声明为const。 声明为const且未显式声明为extern的对象具有内部链接。

是的,那两个是一样的。

但这无效:

int foo();

static int foo() {
  return 0;
}

static - 在此上下文中 - 仅影响范围,当您声明函数static时,它具有文件范围。 因此,您可以通过尝试从其他来源访问该功能来轻松检查它是否相同。

这样我们就避免了关于编译器语言等的讨论。

static属性将可见性更改为编译单元。 这允许在不同文件中使用相同的名称用于不同目的。 你应该只使用静态一次。 如果你有原型,你必须在这里。

当您要求C++ ,不应使用静态但匿名的命名空间来使symbold对编译单元是私有的:

namespace {
    int foo();
}

void bar()
{
    foo();
}

作为旁注,C ++提供了一种优于static替代方案。 您也可以在此处使用未命名的命名空间

例,

namespace 
{  
   void f()
   {
   }
}

看到这些:

未命名的命名空间优于静态?
为什么一个未命名的命名空间是静态的“优越”替代品?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM