簡體   English   中英

在 C 中使用帶 void 的 function 指針

[英]Use function pointer with void in C

我想做一個類似於 C 中的課程注冊的結構。 為此,我使用了 struct 而不是 table。

STUDENT *createStudent(){
    return (STUDENT *) malloc(sizeof(STUDENT));
}

TEACHER *createTeacher(){
    return (TEACHER *) malloc(sizeof(TEACHER));
}

COURSE *createCourse(){
    return (COURSE *) malloc(sizeof(COURSE));
}

COURSEREGISTRATION *createCourseRegistration(){
    return (COURSEREGISTRATION *) malloc(sizeof(COURSEREGISTRATION));
}

我想將這些函數傳遞給帶有 function 指針的變量。 喜歡;

void *createNode(int choise){
    void (*fp[]) () = {createStudent, createTeacher, createCourse, createCourseRegistration};
    return (fp[choise] ());
}

我想用函數指針malloc並在這個 function (main func) 中出錯;

STUDENT *studentHead = NULL;
void *temp = studentHead;
temp = createNode(0);//Zero for student

我不清楚 func 指針。 我應該怎么辦? 我哪里錯了? 或者我可以在這種情況下使用 func 指針嗎?

謝謝

編輯:我解決了這樣的問題;

#define CREATESTUDENT 0
#define CREATETEACHER 1
#define CREATEDCOURSE 2
#define CREATECOURSEREGISTRATION 3

void createNode(void **temp, int choise){
    switch(choise){
        case CREATESTUDENT:
            *temp = (STUDENT *) malloc(sizeof(STUDENT));
            break;
        case CREATETEACHER :
            *temp = (TEACHER *) malloc(sizeof(TEACHER));
            break;
        case CREATEDCOURSE :
            *temp = (COURSE *) malloc(sizeof(COURSE));
            break;
        case CREATECOURSEREGISTRATION :
            *temp = (COURSEREGISTRATION *) malloc(sizeof(COURSEREGISTRATION ));
            break;
    }
}

並使用了調用函數;

STUDENT *temp = studentHead;
createNode(&temp, CREATESTUDENT);

您將fp聲明為 {

void (*fp[]) () = {

這是一個指向返回 void 的函數的指針數組。 你想要返回指針的函數,所以你想要

void *(*fp[])() = {

但是你仍然有一個問題,你用來初始化這個數組的 function 指針是錯誤的類型——它們都是返回指向真實類型(不是 void)的指針的函數。 因此,雖然這可能會起作用,但就標准而言,它實際上是未定義的行為。

如果您將所有create函數更改為返回void *而不是STUDENT * (和類似的),那么它將是安全的。

簡短的回答:您的 function ptr 簽名是void ()而不是void* ()

高興地慶祝 c++ 不太關心 function 返回類型:)

TL;博士;

為什么要讓生活變得比他們需要的更艱難? 為什么不使用簡單的開關

void *createNode(int choice){
  switch(choice){
    case 0:
      return createStudent();
    case 1:
      return createTeacher();
    ...
    ...
  }
}

注意:我沒有看到從一開始就創建createNode的意義。 它似乎具有誤導性的簽名,我會明確地讓 API 用戶調用createStudentcreateTeacher等。

一些編碼風格建議:

  • typedef 你的 function 簽名
  • 聲明您的 function 數組(最好作為成員或 static 到模塊)

根據您的代碼, fpvoid ,而不是void* function。 無論choice如何,您總是不會從createNode返回任何內容。

暫無
暫無

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

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