2015-01-08 92 views
2

MSVC海合會(GCC)4.8.3 20140911以下編譯和運行得很好:Ç - 函數指針類型與命名參數

#include <stdio.h> 

int func(int a, int b){ 
    return 0; 
} 

int main(void){ 
    int (*funcPointer)(int a, int b); 

    funcPointer = func; 

    printf("funcPointer = %p\n", funcPointer); 

    return 0; 
} 

是這樣的行爲明確界定,或者是它是非標準的,它實際上是非法的函數指針類型具有命名參數(即名稱以及類型的參數列表)?

+1

在談論** msvc **和** gcc **(只有兩個實現)你是什麼意思與非標準?據我所知,%p不是打印指針的標準格式(不確定c99和後面)。也不知道你想實現打印函數指針的目的是什麼。 –

+1

@LuisColorado:沒有理由,只是爲了演示目的=) – Mints97

+0

是的,但在這種情況下,不值得談論標準行爲,因爲存在行爲和實現一樣。大多數實現使用函數調用入口點作爲它的指針,所以一旦類型檢查完成(在編譯時),存儲在變量中的值沒有區別 –

回答

4

你可以在你的函數指針中有一個參數。這完全有效。參數列表匹配被調用函數的名稱,名稱只是可選的。

它也可以寫成

int (*funcPointer)(int,int); 

我的意思是

int (*funcPointer)(int a, int b); 

這是有效的,可以通過調用

int res = funcPointer(3,4); 

,並返回

int func(int a, int b){ 
    return a+b; 
} 
驗證相同
1

這是完全合法的。 abfuncPointer不用於任何東西,但它們是允許的。你可以使用你想要的任何(合法)名字,它們根本不重要。

0

答案中的問題:

爲什麼這樣編譯,這是什麼意思?

int func(int a) { return a; } 

int main(int argc, char **argv) 
{ 
    int(*a)(int x(float)) = func; 

    printf("%d\n", a(1)); 

    return 0; 
} 
+1

這不是有效的代碼。您正在聲明'a'作爲指向與您用來初始化的接口不同接口的函數的指針。由於指針不兼容,您會在C中發出警告(C++中有錯誤)。你正在傳遞一個'int'而不是一個指向函數的指針來獲得'float'並返回一個'int',但是編譯器會在沒有檢查的情況下調用它,因爲你調用了一個可變參數函數。它可能會打印「1」,但行爲必須被視爲未定義的語言定義。 –