簡體   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