2010-09-25 94 views
1

ueach是一個循環訪問Unicode字符串並通過向每個字符傳遞單字符字符串來運行回調的函數。C中的奇函數指針警告

string ueach(string s, void *function(string)) { 
    unsigned long i; 
    for (i = 0; i < s.length; i++) 
     function(uchar(s, i)); 
} 

如果我有一個回調testing

void testing(string c) { 
    puts(utoc(c)); 
} 

打印出給定字符(utoc Unicode字符串轉換爲UTF-8 char *)這一切工作正常。使用的代碼:

string a = ctou("Hello, world!"); 
ueach(a, &testing); 

不過,我得到這樣的警告:

test.c: In function ‘main’: 
test.c:8: warning: passing argument 2 of ‘ueach’ from incompatible pointer type 
ulib:171: note: expected ‘void * (*)(struct string)’ but argument is of type ‘void (*)(struct string)’ 

如果我把周圍的ueach原型這樣的功能部分括號:

string ueach(string s, void (*function)(string)) { ... } 

那麼它的工作原理也很好,沒有任何警告。

void * (*)(struct string)void (*)(struct string)有什麼區別?

void *function(string)void (*function)(string)有什麼區別?

回答

4
  • void * (*)(struct string) - 指向返回void *的函數的指針。
  • void (*)(struct string) - 函數指針返回void
  • void *function(string) - 函數返回一個void *
  • void (*function)(string) - 指針函數返回void

第三衰變到所述第一,因爲:

「除了當它是 的操作數sizeof運算符或一元運算符, 類型的函數返回類型爲' 轉換爲一個表達式,它具有 類型'指向返回 類型的函數的指針'。「

C99§6.3.2.1/ 4

3

這只是運營商優先權的問題。在錯誤情況下,編譯器將其解析爲返回void *(一個指向某事的指針)的函數,而不是指向返回void的函數的指針。