我想要一个静态函数,我在定义它之前在我的.c文件中声明:
//file a.c version 1
static int foo();
...
static int foo()
{
...
}
但是,似乎我可以将static
关键字从函数定义中删除,并且我没有得到编译器警告......例如。
//file a.c version 2
static int foo();
...
int foo()
{
...
}
假设这两种形式完全相同,我是否正确?
如果是这样,为什么允许这种差异,我应该使用哪种形式?
答案 0 :(得分:7)
是7.1.1 / 6
在没有存储类说明符的命名空间作用域中声明的名称具有外部链接,除非由于先前的声明而具有内部链接,并且未声明
const
。 / p>
另见7.1.1 / 7的例子
答案 1 :(得分:3)
7.1.1 / 7:
连续隐含的联系 特定实体的声明应 同意。也就是说,在给定的范围内, 每个声明都宣布相同 对象名称或相同的重载 函数名称应表示相同 键。
7.1.1 / 6 :(感谢史蒂夫 - 这也是答案要求明确的必要条件)
在命名空间作用域中声明的名称 没有存储类说明符 除非有外部联系 由于以前的内部联系 声明并提供它不是 声明const。对象声明为const 并没有明确声明extern 有内部联系。
是的,这两个是相同的。
然而这无效:
int foo();
static int foo() {
return 0;
}
答案 2 :(得分:1)
static - 在此上下文中 - 仅影响范围,当您声明函数static时,它具有文件范围。因此,您可以通过尝试从其他来源访问该功能来轻松检查它是否相同。
这样我们就可以避免讨论编译器语言等。
答案 3 :(得分:0)
static属性将可见性更改为编译单元。这允许在不同文件中使用相同的名称用于不同目的。你应该只使用静态一次。如果你有原型,你必须在这里。
当你要求C++
时,你不应该使用静态但匿名的命名空间来使编译单元的symbold变为私有:
namespace {
int foo();
}
void bar()
{
foo();
}
答案 4 :(得分:0)
作为旁注,C ++提供了static
的优越替代方案。您也可以在这里使用未命名的命名空间
实施例,
namespace
{
void f()
{
}
}
见这些:
Superiority of unnamed namespace over static?
Why an unnamed namespace is a "superior" alternative to static?