2013-10-30 56 views
5

我不知道這是否是可能的,但在這裏Compatibility of C and C++維基百科文章說以下內容:捕捉變量通過不帶參數的功能

在C語言中,函數原型不帶參數,例如int foo();, 意味着參數未指定。因此, 用一個或多個參數調用這樣的函數是合法的,例如, foo(42, "hello world")

相比之下,在C++中,不帶參數的函數原型 意味着該函數不帶參數,並且使用參數調用這樣的函數是不合格的。

在C中,正確的方式 聲明不帶參數的功能是通過使用void,如在 int foo(void);

我作了如下的代碼來測試它,趕上傳遞的變量(不工作完全正確)

#include<stdio.h> 
#include<stdarg.h> 

void foo(); 

int main() 
{ 
    int i = 3; 
    foo(i); 
    return 0; 
} 

void foo() 
{ 
// va_list args; 
// va_start(args); 
// 
// int x = va_arg (args, int); 
// printf("%d", x); 
// va_end(args); 
} 

是否有可能趕上通過i或維基百科談論的東西完全不同?

回答

2

來自舊C時代,語言的嚴謹性,呃,放鬆。

的基本想法是,如果你有在一個翻譯單元的功能,說foo.c

float foo(int x) 
{ 
    return 2.0F * x; 
} 

然後要在其他翻譯單元來使用它,說main.c但你不希望打擾寫一個頭文件,你可以這樣做:

int main() 
{ 
    float foo(); 
    float r; 
    r = foo(42); 
} 

而且你不必編寫函數的參數。公平地說,你根本不需要編寫原型,但是編譯器會認爲函數總是返回int,這可能不是你所需要的。

然後,隨着語言的成熟,這種函數聲明被認爲是一個非常糟糕的主意,所以一般來說你不應該(嘗試)使用它。如果你想要一個可變參數函數,那麼通過一切手段來使用它,但聲明它是這樣的。而且您必須至少提供一個真實的參數,才能將呼叫定位到va_start()

+0

謝謝!我想這是我正在尋找的。 –

4

如果您閱讀了關於的文檔,您將會看到它需要參數列表中的最後一個「真實」參數。所以如果你沒有聲明任何參數,在純C中不可能得到參數。

可以做的是聲明沒有參數的函數原型,並且在實際定義中有參數。

+0

是的,我想沒有辦法訪問它們,我故意省略'va_start'中的參數,因爲那樣會失去目的:) –

0

您可以使用任何參數調用該函數,但不能在函數作用域中訪問它們。無論如何,如果您沒有將原型聲明爲int foo (void);,某些編譯器會給出警告,因爲您可能不想這樣做。

5

你不能,至少不會在標準C.什麼維基百科文章的意思是這樣的代碼:

void foo(); 

int main() 
{ 
    int i = 3; 
    foo(i); 
    return 0; 
} 

void foo(int i) 
{ 
    (void)i; 
} 

編譯使用C很好,但它在C++無效,因爲參數的個數不比賽。

+0

您是否閱讀過wiki文章? –

0

有一種方法可以在C程序中訪問這些參數,但我認爲它是一個很大的破解,應該避免。

下一個例子說明如何訪問一個int參數:

#include<stdio.h> 
#include<stdarg.h> 

void foo(); 

int main() 
{ 
    int i = 3; 
    foo(i); 
    return 0; 
} 

void foo(int p) 
{ 
    printf("%d",p); 
} 

現在,我不知道,如果你通過別的東西的話會怎麼樣INT(例如字符*),但它可能會導致一個未定義的行爲。 (如上所述),你不能將參數傳遞給不帶參數的函數。

+0

沒有必要諷刺! :) –