2010-08-10 2 views

답변

1

하, 나는 다른 일이 있었다.

사용자 정의 할 필요가 : 그밖에

void hello(void); 

함수는 매개 변수의 수를 수용 할 수 있습니다.

하지만 당신의 요지를 이해합니다. 심지어 컴파일러가 거의 없다. C에서

+1

@leppie : 따라 가지 않습니다. 컴파일러가 함수에 대한 유효한 호출에 대해 경고해야하는 이유는 무엇입니까? – Troubadour

+3

gcc에'-Wstrict-prototypes' 플래그를 추가하면'xc : 4 : warning : 함수 선언이 프로토 타입이 아닙니다' – caf

+0

@caf : Thanks :) – leppie

11

, void hello()void을 반환하고 모두 함께 다른 시나리오 C++에서 unspecified number of arguments.

을받는 함수 hello()를 선언합니다.

void hello() { 

당신이 그것을하지 무슨 생각을 의미하지 않는다 : C++에서 void hello()void를 반환하고 있기 때문에 no arguments.

12

을받는 함수 hello()를 선언합니다. 사용 :

void hello(void) { 

무효가 없으면 매개 변수를 지정하는 데 신경 쓰지 않을 수 있습니다. 이것은 C가 C++과 다른 많은 방법 중 하나임에 유의하십시오.

4

The C Book 4.2에서 수집 할 수있는 것으로부터 함수 정의는 인수에 대한 형식 정보를 지정하지 않으므로 프로토 타입이 아닙니다. 즉, 컴파일러는 반환 형식 만 기억하고 인수에 대한 정보는 전혀 보유하지 않습니다.

이 정의 형식은 여전히 ​​이전 버전과의 호환성을 허용하며 인수를 사용하지 않는 함수에만 국한되지 않습니다. gcc는 동등하게 허용 할 것입니다

void hello(a) { 
} 

int main(int argc, char* argv[]) { 
int test = 1234; 
hello(test,1); 

return 0; 
} 

여기서 중요한 인수에 대한 유형 정보가 부족합니다. 이 문제를 해결하고 함수가 사용될 때 gcc가 인수를 확인하도록하려면 함수의 선언이나 정의에 유형 정보를 넣을 수 있습니다. 두 가지 모두에 넣는 것이 바람직합니다.

gcc가 당신에게 경고하지 않는 이유에 관해서는이 모든 것이 여전히 실제로 질문에 대답하지 않습니다. gcc 팀은 기본적으로 경고를 억제하는 것을 정당화하기에 충분할 정도로 오래된 스타일의 C 코드가 아직 남아 있다고 생각합니다. IMO 나는 @caf에 언급 된 -Wstrict-prototype 옵션이 기본적으로 켜져 있지 않은 것에 놀랐다.

관련 문제