2014-04-05 4 views
1
typedef void (*MenuItemFunctionPtr)() ; 

struct MenuItem{ 
    char *TextToDisplayPtr; 
    MenuItemFunctionPtr MenuItemFunctionPointer; 
    struct MenuItem *NextMenuItem; 
    struct MenuItem *SubMenuItem; 
}; 

void MenuItemAFunction(); 

C의 구조로 함수의 주소를 얻기 그것을 정의하기 위해 나는 다른 방법이 있어야한다고 생각합니다. 그러나 나는 그것을 올바르게하는 법을 모릅니다.나는 몇 가지 방법으로 내 구조를 정의하려

MenuItem 구조체는 어떻게 채울 수 있습니까?

+0

마지막으로받은 오류는 무엇입니까? 가장 정확한 것 같습니다. 일반적으로 오류 메시지를 포함하면 사람들이 귀하를 도울 수 있습니다. – fmoo

+0

'fmoo'처럼, 마지막은 당신이 필요로하는 옷장이라고 생각합니다. 그러나 마지막 연산자의 주소는 필요 없습니다. struct MenuItem MenuItemA = {textA, & MenuItemAFunction, MenuItemB, 0};'. 컴파일러 오류로 알려줍니다. – jww

+0

함수 포인터 선언을 확인하는 가장 쉬운 방법은'MenuItemFunctionPtr pfn = & MenuItemAFunction;'시도하는 것입니다. 괜찮 으면 문제는 다른'struct' 멤버 (또는 다른 곳)에 있습니다. – jww

답변

0

이전 스타일 함수 선언은 말을하는 것입니다 그 C에서 사용되지 않습니다, C에서,

void MenuItemAFunction(); 

수단 MenuItemAFunction 인수 또는 알 수없는 유형의 알 수없는 번호를 취하는 아무 것도 반환하지 않습니다 기능이 있지만, 선언문은 인수 목록에 대해서는 거의 언급하지 않는다.

인수가없는 함수를 선언하는 적절한 방법은 다음과 같습니다

void MenuItemAFunction(void); 

사이드 참고 : C++,이 다릅니다. () 구문은 인수가없는 함수를 멋지게 선언합니다. Bjarne Stroustrup은 C++가 된 "C와 함께"작업 할 때 고문의 말을 들었습니다. 데니스 리치 (Dennis Ritchie)는 (void)을 "가증함"이라고 불렀다. 그래서 Stroustrup은 확실한 의미를 갖도록 ()을 만들 것을 확신했습니다.

따라서 사용되지 않는 사용법과 관련된 진단을 받고있을 수 있습니다. 그 문제를 해결하십시오. 다시 시도하십시오. 이러한 두 변형이 작동한다 (예컨대 함수 이름 식별자로 구성되는 기본 함수와 같은) 함수를 나타내고, 식 이미로 평가되므로

struct MenuItem MenuItemA = {textA, MenuItemAFunction, &MenuItemB, 0}; 
struct MenuItem MenuItemA = {textA, &MenuItemAFunction, &MenuItemB, 0}; 

& 어드레스의 오퍼레이터가 필요없는 주소 연산자가없는 포인터.

해당 함수의 주소를 사용하려는 경우 함수 호출을 표현하고 싶지 않습니다. 함수에 대한 포인터가 해당 표현식에서 나오게하려면 MenuItemAFunction() 주위에 구문 조합을 사용할 수 없습니다.

귀하의 남은 "정의되지 않은 참조"오류는 단지 을 정의하는 기능 MenuItemAFunction하지 을 선언 한 사실에서 유래한다. 존재하지 않는 함수의 주소를 가져올 수 없습니다. 아마 당신의 프로젝트 (Makefile, IDE, ...)가 잘못 설정되어 있고 그 함수의 정의가 들어있는 소스 파일에서 컴파일하고 링크하지 않을 수도 있습니다.

+0

두 번째 할당은 묻는 사람이 예상하지 않습니다. 그런 다음 구조체에서 typedefed 및 사용 된대로 '함수 포인터'가 아니라 '포인터를 가리키는 포인터'를 저장합니다. – drahnr

+0

@drahnr 기본 C 자습서를 읽어야 할까 봐 걱정됩니다. '& malloc'과'malloc' (예를 들어)을 평가할 때 표현식은 동등합니다. 둘 다 포인터를 함수로 만듭니다. – Kaz

+0

Kaz 나는 당신이 나에게 말한 것을 시도했지만, 나는 여전히 위에서 2 개의 오류를 썼다. –

관련 문제