簡體   English   中英

Function 定義/聲明使用 Function 指針 `typedef` 在 C

[英]Function Definition/Declaration Using Function Pointer `typedef` in C

更新:

這只是一件愚蠢的事情。 在此之后幾分鍾我的電腦崩潰了,重新啟動后它會拋出與其他人相同的錯誤......即使我 go 使用 GIT 回到原始版本。 我猜PC的RAM中有些東西搞砸了? XD

在 C 中,是否可以使用 function 指針類型來聲明和定義 function?

我錯誤地這樣做了,但它按預期工作而沒有發出任何警告:

初始化.h:

typedef bool (*InitFunc)(void);

init.c:

#include <init.h>
#include <moduleX.h>

InitFunc initFuncs[N];

bool init(void)
{    
    ...

    initFuncs[n] = &moduleX_Init;

    ...
}

bool initTask(void* Args)
{

    initFuncs[n]();

}

模塊X.h:

#include <init.h>

InitFunc moduleX_Init(void);

模塊X.c:

#include <moduleX.h>

InitFunc moduleX_Init(void)
{
    
    ...
        
    return true;
}

如您所見,我使用 function 指針的typedef定義了 function moduleX_Init 它使用 GCC (arm-none-eabi-gcc) 編譯,甚至沒有警告並按預期工作。

我只是錯誤地這樣做了,但是當我注意到它時,我想知道這是否實際上是聲明 function 的合規方式,或者它恰好適用於 GCC。

編輯:

如果我做這樣的聲明InitFunc moduleX_Init; ,然后我收到以下錯誤:

從類型“_Bool”分配給類型 InitFunc {aka _Bool (*)(void)}' 時不兼容的類型

因此,當在變量聲明中使用時,function 指針類型就像它們是返回類型的typedef一樣工作。 這是標准行為,還是只是 GCC 的特殊性?

不,您不能使用 function 指針 typedef 來聲明或定義 function。 您可以使用使用 function 指針 typedefs 來指定返回值的類型和 arguments。

您正在聲明 moduleX_Init 返回 function 指針。 那是你想要的嗎? @SergeyA 已經給了您分配的警告,這是您收到的 moduleX_Init 警告(gcc 8.3.0-6,沒有任何 arguments 其他輸入文件):

1.c: In function ‘moduleX_Init’:
1.c:6:9: warning: returning ‘int’ from a function with return type ‘InitFunc’ {aka ‘_Bool (*)(void)’} makes pointer from integer without a cast [-Wint-conversion]                                                                            
  return true;
         ^~~~

您的代碼格式不正確,不可能在沒有警告的情況下編譯它。 這是我用你的代碼得到的一個:

<source>: In function 'init': <source>:11:18: warning: assignment to 'InitFunc' {aka '_Bool (*)(void)'} from incompatible pointer type '_Bool (* (*)(void))(void)' [-Wincompatible-pointer-types]

您的聲明

typedef bool (*InitFunc)(void);

InitFunc moduleX_Init(void);

聲明了一個 function,它返回一個指向 function 的指針。 它本身並沒有什么問題,但是當您嘗試像這樣使用它時:

initFuncs[n] = &moduleX_Init;

您正在分配具有不兼容簽名的 function 指針,因為initFuncs[n]具有類型bool (*)(void)

在 C 中,是否可以使用 function 指針類型來聲明和定義 function?

不,function 指針只是一個指針。 您可以使用它來調用 function 是指向的,並且在任何情況下都可以使用指針

我錯誤地這樣做了,但它按預期工作而沒有發出任何警告

好吧,至於這里的“任何警告”部分編譯器不同意你的看法。 對於這一行:

    typedef bool (*InitFunc)(void);

clang 10編譯器說

dsp$ clang -c min.c
min.c:2:16: warning: type specifier missing, defaults to 'int' [-Wimplicit-int]
typedef bool (*InitFunc)(void);
               ^
min.c:2:9: warning: type specifier missing, defaults to 'int' [-Wimplicit-int]
typedef bool (*InitFunc)(void);
~~~~~~~ ^
min.c:2:14: error: function cannot return function type 'int (void)'
typedef bool (*InitFunc)(void);
             ^
2 warnings and 1 error generated.

gcc 9.3

dsp$ gcc -c min.c
min.c:2:15: error: expected declaration specifiers or ‘...’ before ‘*’ token
    2 | typedef bool (*InitFunc)(void);
      |               ^

至於“它按預期工作”部分,您的期望是什么?

另一個類似的 typedef

typedef int(*Pfri)(int);

這是相當常見的東西,並將名稱Pfri聲明為指向functionpointer ,該指針返回一個int並將一個int作為參數,這一次編譯器會很高興。

C 使用此示例

#define N 10
#include    <stdio.h>

typedef int(*Pfri)(int);

int plus3(int i) { return i*3; };
int plus4(int i) { return i*4; };

int main(void)
{
    Pfri    initFunc[N];
    printf("fills array of function pointers\n");
    for( int i = 0; i<N; i+=2 )
        initFunc[i] = plus4, initFunc[1+i] = plus3;
    printf("\
For odd indexes, function is \"int plus3(int i) { return i*3; };\"\n\
For even  indexes, function is \"int plus4(int i) { return i*4; };\"\n\
Array has %d functions\n", N);
    for( int i=0; i<N; i+=1 )
        printf("f(%d)=%d\n", i,initFunc[i](i) );
    return 0;
}

這個程序:

  • 采用上述 typedef 並聲明它們的數組。
  • 聲明 2 個與此類型定義名稱兼容的函數
  • 用指向函數的指針填充數組
  • 調用每個並顯示結果

Output

fills array of function pointers
For odd indexes, function is "int plus3(int i) { return i*3; };"
For even  indexes, function is "int plus4(int i) { return i*4; };"
Array has 10 functions
f(0)=0
f(1)=3
f(2)=8
f(3)=9
f(4)=16
f(5)=15
f(6)=24
f(7)=21
f(8)=32
f(9)=27

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM