2015-04-17 159 views
0

我敢肯定,以下是合法定義的函數,在一個聲明中聲明一個變量

int a, *b, c[5], d(char x); 

這定義了一個整數a,指針爲int b,5個整數c的數組,並聲明函數d接受一個char並返回int。

在那裏提供函數的定義是否合法? (提供我們不在功能範圍內)

int a, f() 
{ 
    return 1; 
} 

int main() 
{ 
    cout << a << f(); //prints 01; 
} 

MSVC拒絕代碼。如果這樣做是正確的,我想知道標準中的哪個規則允許這樣的函數聲明,但不允許定義。

我想要做一個codegolf風格的挑戰,我需要儘量減少我的代碼在字符方面,我想知道這個技巧是否合法的C++。

+0

您可以在那裏聲明它,但不提供函數體。 – 0x499602D2

回答

3

不,函數定義只有一個聲明符。這是一個在C++ 11 8.4.1和A.7規定:

function-definition: 
    attribute-specifier-seq<opt> decl-specifier-seq<opt> declarator virt-specifier-seq<opt> function-body 
1
int a, *b, c[5], d(char x); 

是有效的,因爲編譯器知道你不會再聲明任何變量。編譯器知道這一點,因爲在語句後面有一個分號。

int a, f() 
{ 
return 1; 
} 

有效的,因爲當你在聲明變量和函數,編譯器不知道。並且當你開始實現函數時;(它認爲你想聲明從intreturn 1之後的第一個分號作爲變量)。