2014-12-14 3 views
-3

에 경고/오류가 발행되지 않습니다컴파일러는 내가 다음 코드가 불일치 함수 매개 변수

TEST.C을

#include "a1.h" 


int main() { 
    int a = 8; 
    foo(a); 
    return a; 
} 

a1.h

void foo (int a); 

a1.c

int f = 0; 

void foo (int a, int b){ 
    f=5+a+b; 
    return; 
} 

a1.c에서 foo가 1 개월 있음에 유의하십시오. re 매개 변수는 a1.h에 정의 된 프로토 타입보다 큽니다.

make all 
Building file: ../src/a1.c 
Invoking: GCC C Compiler 
gcc -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/a1.d" -MT"src/a1.d" -o "src/a1.o" "../src/a1.c" 
Finished building: ../src/a1.c 

Building file: ../src/test.c 
Invoking: GCC C++ Compiler 
gcc -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/test.d" -MT"src/test.d" -o "src/test.o" "../src/test.c" 
Finished building: ../src/test.c 

Building target: test 
Invoking: GCC C++ Linker 
gcc -o "test" ./src/a1.o ./src/test.o 
Finished building target: test 

가 어떻게 자신이 이러한 경우에 방어 할 수 컴파일러는 경고 또는 오류 등 커버 리티로 발행되지 않는 이유는 무엇입니까? 나는 a1.c 파일에 #include "a1.h"를 추가하면 에러가 발생하지만 "include"없이 에러를 얻는 방법이 있는지 알고있다.

+0

마침내 링커 오류가 발생합니까? –

+1

여기서 컴파일러/링커를 호출하는 방법은 무엇입니까? 정의되지 않은 함수에 대한 링커 오류가 발생했습니다. –

+0

또한 이것은 SCA에 의해 감지되는 것이 아닙니다. –

답변

0

foo 과부하입니다. 매개 변수 하나만있는 버전은 정의되지 않으므로 사용하는 경우 링커 오류가 발생합니다.

이러한 경우 어떻게 방어 할 수 있습니까?

함수 오버로딩으로부터 자신을 보호 할 수는 없습니다. 두 헤더 모두에서 소스 파일과 동일한 서명을 갖고 있는지 확인하십시오. 이 a1.h 헤더와 foo(int,int)a1.c에서 파일 foo(int)이 같은 기능 것을 알고하지 않기 때문에

1

컴파일러는 경고를 발행하지 않습니다. C++은 함수가 에 오버로드 된이되도록 허용하므로 두 함수가 잠재적으로 공존 할 수 있습니다. 그래서 C++ 컴파일러가이 문제를 감지 할 수 없기 때문에 연결 단계가 될 때까지 기다려야합니다.

C++가 아닌 C를 사용하여 컴파일하는 경우 a1.c 파일의 맨 위에 a1.h을 포함시켜 컴파일러에서이 조건을 간단히 감지하도록 할 수 있습니다.