1. 程式人生 > >關於C語言函式指標的隨筆

關於C語言函式指標的隨筆

今天博主在編譯C語言程式碼的時候,遇到了兩個警告:

warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]

warning: function with qualified void return type called

產生第一個警告的程式碼片段如下:

...
void my_help();
void my_ls();
void my_cat();

const void (*COMMAND_ENTRY[])() = {
    my_help,
    my_ls,
    my_cat
};
...

產生第二個警告的程式碼片段如下:

...
COMMAND_ENTRY[i]();
...

最後發現 const 在函式指標陣列的宣告中是作用在返回值上的,即 COMMAND_ENTRY 這個函式指標陣列中的函式返回值根據宣告應為 const void ,而用於初始化該函式指標陣列的三個函式的返回值都是 void ,由於返回值不匹配,所以產生了這兩個警告。

實現C語言函式指標陣列中存放不同型別函式指標的一種方式

博主最近的作業系統實驗要求實現一個FAT12映象檢視工具,需要提供命令列介面(Command Line Interface,CLI),博主想設計一個所有實現具體功能的函式的公共入口函式 process_input()

,在設計中用到了表驅動技術。但是問題在於,實現具體功能的函式引數列表並不相同,不能放入一個函式指標陣列中。初始介面如下:

void my_help(const char *command);
void my_ls(const char *format, const char *path);
void my_exit();

最後實現如下:

#define PARAM_COUNT 4

typedef struct _pl {
    char *params[PARAM_COUNT];
} param_list;

// 使用第一個引數
void my_help(const param_list *list
); // 使用前兩個引數 void my_ls(const param_list *list); // 不使用任何引數 void my_exit(const param_list *list); void (*COMMAND_ENTRY[])(const param_list *) = { my_help, my_ls, my_exit };