2011-04-30 107 views
0

能函數定義是這樣的:我可以聲明一個函數而不指定其中一個參數的類型嗎?

int foo(int temp1, int temp2 temp3) { 
    ... 
} 
temp2temp3,會導致錯誤的

具體?如果不是,總體效果如何?

+1

你的意思是*「defined」,* not *「called」* - 爲什麼不自己嘗試一下,看它是否會產生編譯器錯誤? – 2011-04-30 17:36:17

+2

你從哪裏得到這個可能有效的想法? – 2011-04-30 17:36:23

+1

對社羣的一個問題:回答「大聲笑」對這類問題過於苛刻? – akappa 2011-04-30 17:36:57

回答

5

你所有錯誤。這是完全適用於有:

#define temp2 blah) { return 1; } int foo_ (int 
int foo(int temp1, int temp2 temp3) 
{ 
     return 0; 
} 

(這是我第一天早上感覺有點幽默的結果 - 如果你願意,可以隨意倒下;))

+2

+1:你甚至不需要'*',雖然... – 2011-04-30 17:44:30

+3

在這種情況下,整體效果會驅使未來的維護者瘋狂 – 2011-04-30 17:46:04

+0

@blueraja-絕對是我想要的:) – 2011-04-30 17:50:30

3

錯誤是整體效果。

+0

謝謝cnicutar! – adammenges 2011-04-30 17:36:32

+4

標記爲CW,因爲我不應該爲這樣的答案獲得聲望。 – cnicutar 2011-04-30 17:41:48

+0

非常高貴! – 2011-04-30 17:43:54

3

不,這不是有效的C.

0

不,不可能。這是行不通的,因爲temp3並不是真正的參數。編譯器會出現一個錯誤。

0

如果EMP2和TEMP3的參數,這樣,他們每個人都應該有自己的類型,但是這將提供一個編譯錯誤

0

你寫的不是函數的調用方式,而是他們如何被聲明。您將需要一個數據類型各形式參數(INT temp1中,詮釋TEMP2,INT TEMP3)的前

1

如果你真的想將三個參數傳遞給一個函數,但你只知道他們兩個在編譯時的類型,那麼你可以使用可變參數來完成它名單。假設你要的第三個參數是一個intdouble,但你必須檢查temp1temp2首先要知道它應該是:

#include <stdarg.h> 

int foo(int temp1, int temp2, ...) { 
    va_list ap; 
    int  temp_int; 
    double temp_double; 

    va_start(ap, temp2); 
    /* 
    * Figure out what type you want the third argument to be 
    * and use va_arg(ap, int) or va_arg(ap, double) to pull 
    * it off the stack. 
    */ 
    va_end(ap); 

    /* 
    * Get on with what foo() is really all about (including 
    * return an int. 
    */ 
} 

這種類型的黑客不會保護你對某人的話說foo(1, 2)foo(3, 4, "fish") ,或類似的詭計,但這是C和C假定你長大了並對自己的行爲負責。

相關問題