2012-04-13 8 views
1

오늘 Clang은 프로그램을 컴파일하려고 시도하면서 다소 이상한 메시지를 보냈습니다. 난 정말 C와 경험이 아니에요, 그래서 내가 뭔가 잘못하고있을 수도 있지만 실제로 시도 코드는 이것이다 : '합'기능을 선언 할 때함수 프로토 타입 C

#include <stdio.h> 
#include <stdlib.h> 

int sum(a,b); 

int main() 
{ 
    printf(sum(1,2)); 
    return 0; 
} 

int sum (int a, int b) 
{ 
    return a + b; 
} 

당신은 아마 눈치 챘을 때, 나는 ' param은 포함하지 않았습니다. 유형, 그래서 오류가 발생할 수 있지만, 연타 나에게주는 실제 메시지는 이것이다 : 그것은 그것이 단지 함수 정의에서 허용 말할 때

ind.c:4:9: error: a parameter list without types is only allowed in a function definition 
int sum(a,b); 
     ^
ind.c:12:5: error: redefinition of 'sum' as different kind of symbol 
int sum (int a, int b) 
    ^
ind.c:4:5: note: previous definition is here 
int sum(a,b); 
    ^
2 errors generated. 

연타가 무엇을 의미합니까? int sum(a,b);은 함수 정의가 아닙니까?

+1

또한'sum (1,2)'의 반환 값을'printf '하려고 할 때 몇 가지 문제가 발생할 것입니다. 'printf ("% d", sum (1,2))'를 대신 사용해보십시오. – Michael

답변

6

아니, int sum(a, b);이다, 또는 오히려, 같은 기능 선언 아닌 정의 보인다.

함수 선언은 컴파일러가 함수 호출을 생성 할 수있는 충분한 정보를 제공합니다. 정의는 선언을 제공하며 함수가 호출 될 때 실행될 코드를 정의합니다 ({} 사이의 내용).

함수 선언 (정의의 일부가 아님)에는 매개 변수의 유형 또는 유형과 이름이 포함될 수 있지만 이름은 포함되지 않을 수 있습니다.

예에 대한 함수 정의가 매개 변수의 단지 이름을 가질 수 이전 스타일 (.이 유형을 포함하는 경우, 그것은 프로토 타입의) :

int sum(a, b) 
int a; 
int b; 
{ 
    return a + b; 
} 

그러나 이전 스타일의 정의 선언은 진부 해져서 피하는 것이 가장 좋습니다. 구식 선언은 매개 변수의 유형 수를 지정하지 않으므로 컴파일러는 호출의 정확성을 확인할 수 없습니다.

int sum(); 

하지만 다음과 같아야합니다 :

귀하의 선언 다음과 같이 할 수

int sum(int a, int b); 

또는이 :

int sum(int, int); 

아, 그리고이 int main()int main(void)으로 작성되었습니다.

+0

설명해 주셔서 감사합니다, 키이스. 매우 명확하고 간결합니다. 이 답변을 최고의 답변으로 받아 들여야합니다. – icedgoal

3

int sum();선언입니다. 함수의 이름을 지정하지만 컴파일러에 어떤 기능을하는지는 알려주지 않습니다. 컴파일러에게 무엇을하는지 알려면 을 정의 함수으로 정의하면됩니다. 세미콜론 대신에 문장이 들어간 중괄호를 사용했다면 함수 정의를 할 수 있습니다.

+0

Graham에게 대답 해 주셔서 감사합니다. 알았다. 다시 한번 감사드립니다. – icedgoal