Функция обратного адреса, вызывающая проблемы

#c #pointers #struct

#c #указатели #структура

Вопрос:

Я пишу программу на C и настраиваю структуру, которая будет использоваться внутри другой структуры, вот так:

typedef VOID(WINAPI* OriginalFunc)(PVOID);

 struct C_Child
{
    
    VOID GetName( )
    {
        return ((OriginalFunc*)(this))[0x0000](this);
    }
}; 
  

Затем:

 struct C_Parent
{
    struct C_Child* Child;
} Parent;
  

Однако, когда я вызываю свою структуру следующим образом:

Parent.Child->GetName();

Чтобы получить доступ к функции «getName» внутри моего дочернего класса из родительского, я всегда не могу выполнить компиляцию, и мне выдаются многочисленные синтаксические ошибки.

Пример 1: введите описание изображения здесь

Пример 2: введите описание изображения здесь

Прежде чем меня будут слишком сильно ругать, я просто уведомлю всех здесь, что я в основном работаю на C , и я делал это много раз, прежде чем использовать его — я знаю, что языки разные, но я серьезно просто смущен тем, почему это вызывает такую проблему.

Есть ли у кого-нибудь идеи о том, как я могу это исправить или, возможно, достичь того же результата другим способом?

Любая помощь приветствуется.

Комментарии:

1. Вы не можете определять функции (такие как GetName() ) внутри структуры в C. C не обеспечивает группировку кода и данных, которую выполняет C .

2. Черт возьми. Да, у меня были некоторые предположения, но я не думал, что это результат того, как язык обработал это. Спасибо, @JonathanLeffler!

3. Пожалуйста: ошибка в тексте (копировать-вставить), а не в виде скриншота!

Ответ №1:

Я думаю, это то, что вы хотите:

 VOID WINAPI C_Child_GetName(PVOID a) {
  // ...
}

struct C_Child {
   OriginalFunc GetName;
} Child = {
   .GetName = C_Child_GetName,
};

struct C_Parent {
   struct C_Child *Child;
} Parent = {
   .Child = amp;Child,
};
  

Это позволяет выполнять запрошенные

 Parent.Child->GetName();
  

Протестировано с использованием

 typedef void VOID;
typedef void *PVOID;
#define WINAPI
typedef VOID (WINAPI *OriginalFunc)(PVOID);
  

Комментарии:

1. К сожалению, Джон был прав насчет моей проблемы. Это выглядит действительно хорошо, но, по-видимому, язык не может обрабатывать группирующие индексы, которые может C . : (

2. Вы уже знали, что синтаксис, который вы хотели, был запрещен. Я предоставил правильный синтаксис для достижения того, что вы хотели сделать ( Parent.Child->GetName(); )

Ответ №2:

Я не уверен, что понимаю, что вы хотите сделать:(

Вы не можете иметь функцию внутри структуры, но вы можете написать код, подобный этому

 #include <stdio.h>
#include <windows.h>

typedef void* (*pFV)(void*);

typedef struct 
{
    pFV         name[4];
}   C_Child;


typedef struct
{
    C_Child*    Child;
}   Parent;

void* GetName(void* v)
{
    printf("GetName()n");
    return v;
}

int main(void)
{
    Parent   parent;
    C_Child  child;

    child.name[0] = GetName;
    parent.Child = amp;child;
    (parent.Child->name[0])(NULL);
}
  

И адреса функции загрузки внутри дочернего класса. Это обычная конструкция, подобная таблице виртуальных функций, и часто используется в Windows и других системах

Эта строка

         (parent.Child->name[0])(NULL);
  

вызывает функцию GetName() , как и ожидалось.

Это то, что вы хотите?