циклическая зависимость - структуры и указатели на функции, ссылающиеся друг на друга - PullRequest
3 голосов
/ 02 апреля 2012

Я не могу скомпилировать следующую программу из-за циклической зависимости между структурой и указателем на функцию.

// fnPtr.cpp: определяет точку входа для консольного приложения.//

#include "stdafx.h"
#include "stdlib.h"
//typedef gNewType;
typedef void (*ptr)(gStruct *pStr, int pNm);
struct gInStruct{
char *sAlpBet;
ptr sFunPtr;    
};

struct gStruct{
//gNewType sNtype;
gInStruct sInStruct;
int sNum;
};
//typedef void (*ptr)(gStruct *pStr, int pNm);
void myFun(char *pStr1, int pNum){

return ;
}
int _tmain(int argc, _TCHAR* argv[])
{
void (*fnPtr)(char *pStr, int pNm);
char lAlphabet = 'a';
fnPtr = myFun;
gStruct *lStructPtr = (gStruct*)malloc(sizeof(gStruct));
lStructPtr->sNum = 10;
lStructPtr->sInStruct.sAlpBet = &lAlphabet;
lStructPtr->sInStruct.sFunPtr = fnPtr;
return 0;
}

Я получаю следующие ошибки:

Ошибка 7 ошибка C2039: 'sFunPtr': не является членом 'gInStruct' c: \ users \ saurabh17g \ documents \ visualstudio 2010 \ projects \ fnptr \ fnptr \ fnptr.cpp 31

Ошибка 3 ошибка C2062: тип int неожиданный c: \ users \ saurabh17g \ Documents \ visual studio 2010 \ projects \ fnptr \ fnptr \ fnptr.cpp 7

Ошибка 1 ошибка C2065: «gStruct»: необъявленный идентификатор c: \ users \ saurabh17g \ documents \ visual studio 2010 \ projects \ fnptr \ fnptr \ fnptr.cpp 7

Ошибка 2ошибка C2065: 'pStr': необъявленный идентификатор c: \ users \ saurabh17g \ Documents \ visual studio 2010 \ projects \ fnptr \ fnptr \ fnptr.cpp 7

Ошибка 4 ошибка C2146: синтаксическая ошибка: отсутствует ';'перед идентификатором 'sFunPtr' c: \ users \ saurabh17g \ Documents \ visual studio 2010 \ projects \ fnptr \ fnptr \ fnptr.cpp 10

Ошибка 5 ошибка C4430: отсутствует указатель типа - предполагается, что int.Примечание: C ++ не поддерживает default-int c: \ users \ saurabh17g \ documents \ visual studio 2010 \ projects \ fnptr \ fnptr \ fnptr.cpp 10

Ошибка 6 ошибка C4430: отсутствует указатель типа - предполагается, что int.Примечание: C ++ не поддерживает default-int c: \ users \ saurabh17g \ Documents \ visual studio 2010 \ projects \ fnptr \ fnptr \ fnptr.cpp 10

Если я комментирую первый typedef и раскомментирую второй typedef

Ошибка 4 ошибка C2039: «sFunPtr»: не является членом «gInStruct» c: \ users \ saurabh17g \ documents \ visual studio 2010 \ projects \ fnptr \ fnptr \ fnptr.cpp 31

Ошибка1 ошибка C2146: синтаксическая ошибка: отсутствует ';'перед идентификатором 'sFunPtr' c: \ users \ saurabh17g \ documents \ visual studio 2010 \ projects \ fnptr \ fnptr \ fnptr.cpp 10

Ошибка 2 ошибка C4430: отсутствует указатель типа - предполагается, что int.Примечание: C ++ не поддерживает default-int c: \ users \ saurabh17g \ documents \ visual studio 2010 \ projects \ fnptr \ fnptr \ fnptr.cpp 10

Ошибка 3, ошибка C4430: отсутствует указатель типа - предполагается, что int.Примечание: C ++ не поддерживает default-int c: \ users \ saurabh17g \ documents \ visual studio 2010 \ projects \ fnptr \ fnptr \ fnptr.cpp 10

Пожалуйста, дайте мне знать возможный ответ.Заранее спасибо, Саурабх

Ответы [ 2 ]

3 голосов
/ 02 апреля 2012

Вы должны объявить структуру, прежде чем сможете ее использовать.

Просто добавьте struct gStruct; перед typedef, и все будет хорошо.

0 голосов
/ 04 апреля 2012
// fnPtr.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "stdlib.h"
//typedef gNewType;
struct gStruct;
typedef void (*ptr)(gStruct *pStr, int pNm);
struct gInStruct{
char *sAlpBet;
ptr sFunPtr;    
};

struct gStruct{
//gNewType sNtype;
gInStruct sInStruct;
int sNum;
};
//typedef void (*ptr)(gStruct *pStr, int pNm);
void myFun(gStruct *pStr1, int pNum){

return ;
}
int _tmain(int argc, _TCHAR* argv[])
{
void (*fnPtr)(gStruct *pStr, int pNm);
char lAlphabet = 'a';
fnPtr = myFun;
gStruct *lStructPtr = (gStruct*)malloc(sizeof(gStruct));
lStructPtr->sNum = 10;
lStructPtr->sInStruct.sAlpBet = &lAlphabet;
lStructPtr->sInStruct.sFunPtr = fnPtr;
return 0;
}
...