簡體   English   中英

Function 塊內聲明 C

[英]Function declaration inside of block in C

C 標准 (C99 +) 是否要求實現允許將 function 聲明放置在一個塊內,以便將其 scope 限制在該塊內,標准中涵蓋了哪些內容? 假設 function 具有外部鏈接,並且在鏈接時包含在單獨的源文件中定義。

我注意到編譯以下程序時 GCC 會產生錯誤:

int main(void)
{
  void myFunc(void);

  myFunc();

  return 0;
}

void test2(void)
{
  myFunc();
}

錯誤(這是預期的):

..\main.c: In function 'test2':
..\main.c:12:3: warning: implicit declaration of function 'myFunc' [-Wimplicit-function-declaration]
   12 |   myFunc();
      |   ^~~~~~
..\main.c:3:8: note: previous declaration of 'myFunc' was here
    3 |   void myFunc(void);
      |        ^~~~~~
..\main.c:12:3: error: incompatible implicit declaration of function 'myFunc'
   12 |   myFunc();
      |   ^~~~~~
..\main.c:3:8: note: previous implicit declaration of 'myFunc' was here
    3 |   void myFunc(void);
      |        ^~~~~~

這是意料之中的,因為myFunc()是在main()的 scope 中聲明的。

如果從test2()中刪除了對myFunc()的調用,並且在鏈接時包含的另一個源文件中定義了test2() ,則程序編譯和鏈接時不會出現錯誤或警告。

基於這個結果,問題的答案是肯定的,但我想知道這種行為是否在規范中明確定義並且可以被認為是可移植的。

function內

void test2(void)
{
  myFunc();
}

名稱myFunc未聲明。

function 的聲明僅在 main 中可見。

為了向后兼容,編譯器認為 function 具有返回類型int

至於你的問題,那么你可以在塊 scope 中聲明一個 function 但沒有存儲 class 說明符,除了extern (C 標准,6.7.1 存儲類說明符):

6 具有塊 scope 的 function 的標識符聲明除 extern 外不應有明確的存儲類說明符。

也就是說,您不能在塊 scope 中聲明 function,例如

int main(void)
{
  static void myFunc(void);

  myFunc();

  return 0;
}

C 標准 (C99 +) 是否要求實現允許將 function 聲明放置在一個塊內,以便將其 scope 限制在該塊內?

是的。

這包含在標准中的什么地方?

遵循語法:函數定義-> compund-statement -> block-item-list -> block-item -> declaration-specifiers -> [ declaration-specifiers -> type-specifier void + init-declarator-list -> init -declarator -> declarator -> [ direct-declarator myFunc + ( + empty identifier-list + ) ]+ ; ].

用於表示語法的符號也有解釋: https://port70.net/~nsz/c/c99/n1256.html#6.1p1

換句話說,一個 function 定義有一個代碼,它由聲明和表達式組成。 function 聲明是可能的聲明之一,因此它可以在 function 定義的塊內。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM