2012-04-02 3 views
3

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

// 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 \ документы \ Visual Studio 2010 \ проекты \ 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 \ docum ents \ 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++ не поддерживает по умолчанию-INT C: \ Users \ saurabh17g \ Documents \ Visual Studio 2010 \ Projects \ fnptr \ fnptr \ fnptr.cpp 10

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

Ошибка 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

Пожалуйста, дайте мне знать возможный ответ. Заранее благодарен, Saurabh

ответ

3

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

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

+0

Спасибо asaelr .. Это сработало! Однако была еще одна ошибка. Определение указателя функции не содержало ссылки на структуру. –

0
// 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; 
} 
Смежные вопросы