2015-12-07 81 views
1

任何人都可以建議我代碼的下列代表什麼?如何理解這種函數聲明?

static int(*pfcn[2]) (char *, ...) = { (void *)printf, (void *)NULL }; 
+0

@milevyo - 爲什麼這麼說? – artm

+0

初始化器應該是一個常量;這不是一個常量初始值設定項。 – milevyo

+0

對不起,我沒有正確閱讀。 :) – milevyo

回答

5

C gibberish ↔ English是一個不錯的網站,可以幫助解釋聲明

// declare pfcn as array 2 of pointer to function (pointer to char, ...) returning int 
int(*pfcn[2]) (char *, ...) 

{ (void *)printf, (void *)NULL };初始化數組與功能printf()然後NULL,可能指示結束。

int printf(const char *format, ...) 
NULL 

static裝置陣列是本地和只能訪問的功能/ C文件是英寸


@Lundin建議其編譯良好。

// { printf, (void *) NULL }; 
{ printf, NULL }; 

IMO,還聲明要

//     const added 
static int(*pfcn[2]) (const char *, ...) = { printf, NULL }; 

注:某些C可能不允許鑄造NULL一個函數指針。在這種情況下,代碼可以使用

static int printf_null(const char *format, ...) { 
    return 0; 
} 

static int(*pfcn[2]) (const char *, ...) = { printf, printf_null }; 

...和測試針對printf_null,而不是NULL檢測結束。避免投射是一件好事。

+0

該網站不是特別好,因爲它在可變參數列表上失敗時,我嘗試:[看到此](http://cdecl.ridiculousfish.com/?q=int%28*pfcn [2]%29 +%28char + *%2C + ...%29)。 – Lundin

+0

@Lundin同意,因此黃鼠狼的話,「幫助」。對於一個免費網站來說不算太壞。 – chux

+2

順便說一句,你可以在空指針和函數指針之間進行轉換,它是一個定義良好的行爲。但是,在標準的C中,你不能在函數指針和常規指針之間進行轉換(例如問題中的'void *')。 – Lundin

4

pfcn是一個函數指針數組。

這些函數是那些在返回int時需要可變數量的參數。

1

這是一個(難以閱讀)定義兩個函數的數組。我會寫這樣的:

#include <stdio.h> 
#include <stdlib.h> 

typedef int (*Function)(const char *format, ...); 

static Function pfcn[2] = {printf, NULL}; 

點意味着函數將接受零個或多個參數後第一個。