[英]Scope of parameters in a complex function definition
考慮以下模糊的函數定義,返回一個指向char
數組的指針:
char (*func(int var))[sizeof var]
{
return 0;
}
有效嗎?
值得懷疑的部分是在sizeof
表達式中使用標識符var
。 至少根據GCC 4.9.2, var
在表達式sizeof
不可見。 (請注意,如果sizeof表達式中的var
替換為42
,則代碼有效,此問題變得無趣。)
但是,在C11規范草案n1570中(相關部分在C99中相同,但可能有不同的子條款編號),第6.2.1節討論了標識符的范圍,並包含以下與此案例相關的句子:
6.2.1p4包含:
如果聲明標識符的聲明符或類型說明符出現在塊內或函數定義中的參數聲明列表中,則標識符具有塊作用域,該作用域終止於關聯塊的末尾。
6.2.1p7包含(加粗礦井):
結構,聯合和枚舉標記具有在聲明標記的類型說明符中標記出現之后開始的范圍。 每個枚舉常量都具有在枚舉器列表中定義枚舉器出現之后開始的范圍。 任何其他標識符的范圍都在其聲明者完成之后開始。
顯然, var
的聲明var
出現在函數定義中的參數聲明列表中。 因此,根據6.2.1p4,其范圍在函數體的末尾結束(“關聯塊”)。 此外, var
明確對應於6.2.1p7中提到的“任何其他標識符”,因此其范圍在其聲明符完成之后,即在參數列表的末尾開始。
在我看來,規范沒有說明var
的范圍。 鑒於規范沒有另外說明,對范圍的“開始”和“結束”的明顯(對我來說,無論如何)解釋意味着范圍從開始到結束跨越整個詞匯間隔。 因此,似乎var
實際上應該在sizeof
表達式中可見。
規范中有什么我沒有考慮到的嗎? 標識符范圍的概念是否應該以“從范圍開始到范圍結束的不間斷詞匯間隔”的其他方式進行解釋? 如果是這樣,在規范中這是如何表現的?
[sizeof var]
部分不是塊的一部分,也不是聲明列表的一部分,而是返回類型的一部分。 因此,可見的唯一標識符是具有文件范圍的標識符。
函數的返回類型在聲明函數本身的塊作用域或文件作用域中定義。 它不屬於函數定義的最外部塊范圍。 在此范圍內(聲明函數),尚未聲明函數的參數。
您可以將功能定義視為
return type: char ( * )[sizeof var] // Oops..What is var?!
{
// function block scope including its parameters declarations;
int var;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.