2016-09-09 1 views
1

내 c-compiler가 (단순화 된) 코드를 따르는 경고/오류를 표시하는 이유를 알아 내려고합니다.C - gcc : 다른 함수 선언/구현을 사용하는 컴파일러 경고가 없습니다.

some.h :

void foo();

some.c :

static uint32_t count = 0; 

void foo(uint32_t num) { 
    count += num; 
    print("Count: %u"); 
} 
기능 - 실행 파라미터를 동시에

함수 선언는 매개 변수가 없다

mai n.c :

foo(100); 
foo(); 

출력 : 대상 빌드

Count: 100 
Count: 100 

컴파일러 : 대상 빌드

gcc-arm-none-eabi-4_9-2015q1-20150306-win32 

링커 :

,691,363,210
gcc-arm-none-eabi-4_9-2015q1-20150306-win32 

컴파일러 플래그 : C에서

-Wall -Werror -DuECC_CURVE=uECC_secp256r1 -DMEMORY_CHECK -DDEBUG -Os -g3 -DBACKTRACE

+0

귀하의 편집문은 무엇입니까? 포함합니까? –

+0

'print'는'printf'라고 가정합니다.BTW [UB] (https://en.wikipedia.org/wiki/Undefined_behavior)는 [UB] (https://en.wikipedia.org/wiki/Undefined_behavior) – LPs

+0

디버깅 도움을 구하는 질문 ("왜 이것이 아닌가요? 코드 작동? ")에는 원하는 동작, 특정 문제 또는 오류 및 질문 자체에서이를 재현하는 데 필요한 가장 짧은 코드가 포함되어야합니다. 분명한 문제 성명이없는 질문은 다른 독자에게 유용하지 않습니다. See : 최소한의 완전하고 검증 가능한 예제를 만드는 방법. – Olaf

답변

0

이 함수 선언

void foo(); 

은 선언의 시점에서 함수의 매개 변수에 대해 알려진 것이없는 것을 의미한다.

매개 변수의 유형과 개수는 함수 호출에서 추론됩니다. 프로그램 다음이 호출

foo(); 

에 대한

으로 행동을 정의되지 않았기 때문에 매개 변수의 수 및 인수 불일치의 수. 때문에 이전 버전과의 호환성

4

인자없이 함수를 선언하지 않는

void foo(); 

같은 선언은, 그것은 알 수없는 형의 인수의 알 수없는 번호를받는 함수를 선언합니다.

즉, 호출이 모두 정확하다는 것을 의미합니다. 컴파일러는 실제로 그것에 대해 경고 할 수 없습니다.

다른 문제는 소스 파일의 선언이 실제로 헤더 파일의 선언과 일치한다는 것입니다. 단지 더 정확하게 만듭니다. 따라서 경고 나 오류가 발생하지 않습니다.

+5

여기에 인자를 취하지 않는 함수 선언이 있습니다 :'void foo (void);' –