2011-09-18 3 views
2

그래서 여기서는 약간 혼란 스럽습니다. 나는 더 큰 프로젝트에서 작업하지만, 몇 가지 문제로 실행, 그래서 나는 간단한 구조체를 사용하여 약간의 테스트 케이스를 작성 해요 : 내가 할 노력하고있어 모든 테스트 구조체에서 속성을 읽어다른 반환 형식에도 불구하고 함수를 반환 함

#include <stdio.h> 

typedef struct{ 
    int property1; 
}test; 

int main(){ 
    test testing = getNumber(); 
    printf("%d",testing.property1); 
    return 0; 
} 

test getNumber(){ 
    test testing = {2}; 
    return testing; 
} 

을 getNumber()에서 반환됩니다. 그러나, 컴파일러는 다음 오류 때문에 불평 :

test.c(8) : error C2440: 'initializing' : cannot convert from 'int' to 'test'

그래서 내 질문은 왜이 기능이 나를 시험 반환 유형을 지정에도 불구하고 int를 반환하려고? 이 문제를 어떻게 해결할 수 있습니까? 방금 단순한 걸 눈이 멀었나요?

+11

프로토 타입이 누락되었습니다. –

+0

오 이런 ... 나는 그것을 놓쳤다는 것을 믿을 수 없습니다. 고마워. 와우. – BraedenP

+2

@ Paul : 다른 사람이 답장 상자에 복사/붙여 넣기하는 것을 싫어합니다. – Jon

답변

5

당신은 프로토 타입을 놓치고 :

#include <stdio.h> 

typedef struct{ 
    int property1; 
}test; 

test getNumber(void); // <<< missing prototype 

int main(){ 
    test testing = getNumber(); 
    printf("%d",testing.property1); 
    return 0; 
} 

test getNumber(void){ 
    test testing = {2}; 
    return testing; 
} 
+0

예 - 또는'main' 앞에'getNumber'를 정의 할 수 있습니다. 재귀가 없으면 별도의 선언을 필요로하지 않는 명령이 항상 있습니다. 선호되는 것은 취향과 스타일의 문제입니다. –

2

여기에 오류 메시지가 조금 모호합니다. c 함수의 기본 반환 유형은 int입니다. 컴파일러가 int에서 test으로 변환 할 수 없다고보고했습니다. 그러나 실제로는 getNumber()이 무엇인지 모르기 때문에 실패했습니다. 컴파일러 오류 메시지는 getNumber()에 대한 정의되지 않은 호출 또는 해당 행의 일부 내용을 약간 명확하게 표시해야합니다.

C 컴파일러는 위에서 아래로 접근합니다. 어떤 변수를 사용했는지, 함수 호출은 미리 알려 져야합니다. 컴파일러는 다음과 같은 성명보고 그래서 때 -이 시점까지

test testing = getNumber(); 

를이 getNumber()이 무엇을 알고하지 않습니다. 컴파일러를 행복하게 만드는 두 가지 옵션이 있습니다.

  1. 함수 선언을 앞쪽으로 선언하십시오.
  2. 함수 정의를 main() 이상으로 이동하십시오.
관련 문제