gcc는 링킹시 파라메터 체크는 안 하는거 같네요.
글쓴이: vananamilk / 작성시간: 목, 2014/03/13 - 9:53오전
개발중에 이상한 현상이 있더라구요. 예를 들어 아래와 같은 코드가 있을 때...
== a.c
#include
extern void test(int a, int b);
int main()
{
test(1, 2);
return 0;
}
== b.c
#include
void test(int a, int b, int c)
{
printf("%d %d %d\n", a, b, c);
return;
}
# gcc -o c a.c b.c
# c
1 2 -1251069960
링킹 과정중에 에러가 날꺼라 예상했는데 안 나네요. obj 파일은 a.c 파일에서 프로토타입이 맞으니
생성된다지만 링킹 과정중에 정의된 함수와 파라메터 수, 타입은 체크를 안하는듯 하네요.
좀 더 테스트 해보니 g++은 에러가 나네요^^
Forums:
GCC가 그런게 아니라 원래 링크할때는 파라메터를
GCC가 그런게 아니라 원래 링크할때는 파라메터를 체크하지도 않습니다(기술적으로 가능한지도 모르겠네요).
링크는 심볼을 찾아서 연결하는 과정인데, 심볼에는 파라메터라는 정보가 포함되지 않습니다.
C++의 경우에는 함수 오버로딩을 위해서 네임맹글링을 하기 때문에 심볼에 파라메터 정보가 들어가는데 오버로딩이 없는 C에서는 함수 이름이 (거의) 그대로 심볼로 쓰입니다.
네임맹글링 없이는 함수 이름만으로 인자의 타입과
네임맹글링 없이는 함수 이름만으로 인자의 타입과 개수를 알수 없습니다. C는 기본적으로 네임맹글링이 없는 언어죠.
하긴 그렇겠네여~
^^
댓글 달기