2017-06-02 198 views
1

我已經給出了一個代碼。我需要使用以下功能,但我有問題調用它。C函數指針和typedef

int myFunction(const struct LQuery *pQuery, 
        f_Callback Callback, 
        const void *pPriv); 

而且我有以下定義

typedef void (f_Callback) (int NumOfRecordsFound, 
          void *pPriv, 
          const tL_QueryResult *pData); 

我明白Callback應該是指針my_callbackFunction但我似乎無法理解如何將參數設置它。據我所知pQuery傳遞給回調函數,但f_Callback需要3個參數。

int main (int Argc, char *pArgv[]) 
{ 
    myFunction(what should go here and WHY) 
} 
+0

你有什麼疑問?如何傳遞參數來回叫或如何傳遞迴叫? – LearningC

+0

1)這不是一個定義,而是一個聲明。 2)這不會編譯。您無法傳遞函數作爲參數。 '回叫'不是一個函數指針! – Olaf

回答

3

回調函數將從myFunction調用。您必須將您的回調函數作爲參數傳遞。這裏有一個例子:

#include <stdio.h> 

typedef void (f_Callback)(int a, 
          int b, 
          int c); 

int myFunction(int a, f_Callback* callback) 
{ 
    callback(a, a+1, a+2); 
} 

void myCallback(int a, int b, int c) 
{ 
    printf("a: %d, b: %d, c: %d\n", a, b, c); 
} 

int main() 
{ 
    myFunction(5, &myCallback); 
    return 0; 
} 

預期輸出:

$./a.out 
a: 5, b: 6, c: 7 
+0

@Stargateur指針現在是明確的。謝謝 – user3188346

2

的類型定義是不正確。它應該是

typedef void (*f_Callback) (
       int NumOfRecordsFound, 
       f_Callback Callback, 
       const void *pPriv); 

這是一個正確的指針功能 - 注意星;否則它將聲明一個函數原型的typedef,你不能用它作爲變量,儘管它可以在函數聲明中使用。

如果你有一個像

int myFunction(const struct LQuery *pQuery, 
       f_Callback Callback, 
       const void *pPriv); 

一個函數和一個回調

void my_callback_function(int records_found, 
          f_Callback callback, 
          const void *priv) 
{ 
     ... 
} 

你可以叫myfunction僅僅作爲

myFunction(the_query, my_callback_function, the_private_pointer); 

左值my_callback_function會衰變成一個指針到功能,所以不需要&字符。

+0

我知道typedef通常被放在'typedef void(* f_Callback)'中,但是提供的代碼與我已經複製的一樣,並且工作正常。感謝您瞭解它會起作用的情況。 –

0
typedef void (f_Callback) (int NumOfRecordsFound, 
          void *pPriv, 
          const tL_QueryResult *pData); 

C不會讓你聲明功能,但只定義他們。

試着讓解析器插入一個函數的別名是沒有意義的。

您必須爲指向函數的指針定義別名。