2012-02-20 4 views
0

일부 기존 C 코드를 Java로 마이그레이션 할 목적으로 컴파일 중입니다.
숫자 결과를 비교하기 위해 C 코드를 수정하고 싶지 않습니다. 실행하고 싶습니다.호환되지 않는 포인터 유형을 gcc (char ** → void **)로 무시하십시오.

이 gcc 4.6.1 컴파일 오류가 발생합니다. expected void** but argument is of type char**
20 년 전에 작성된이 코드는 포인터 유형에 별 관심이 없었습니다.

질문 : 어떻게하면 gcc가 이러한 오류를 무시하고 컴파일하도록 할 수 있습니까?
-fpermissive이 작동하지 않습니다.

+0

왜 고치지 않습니까? –

+0

@ChrisLutz : 몇 년이 걸릴 것이기 때문에, 농담이 아닙니다. –

+0

적어도 핵심 영역에 명시 적 캐스트를 뿌리면 컴파일러가 종료되고 코드는 이전과 같은 방식으로 계속 작동합니다. –

답변

3

컴파일하려는 gcc의 버전은 무엇입니까? GCC 3 like a K&R C compiler을 행동을 말할 것 -traditional 플래그를 지원하지만,이 옵션은 당신은 아마 VM에서 그것을 포함 된 OS를 설치하는 것처럼, 어떻게 든 GCC 3를 실행해야

GCC 4에 포함되지 않습니다. RHEL 4에서 gcc 3을 사용했거나 오래된 FreeBSD 버전을 사용해 보거나 새로운 OS에서 패키지로 사용할 수 있습니다.

+0

GCC 4.6.1을 사용 중입니다 ... GCC 3을 설치하려고합니다. 코드의 일부분에 "windows.h"와 "objbase.h"가 포함되어 있기 때문에 안타깝게도 Windows에서 컴파일해야합니다. –

+0

사실 "-traditional -E"는 GCC 4.6.1에서 작동하는 것 같습니다 :-) –

+0

방금 ​​-E가 코드를 컴파일하지 않습니다 ... –

2

기본적으로 gcc는 경고 만 표시합니다. 이 경고를 오류로 만드는 컴파일 플래그 어딘가에 -Werror 또는 -pedantic-errors 플래그가 있어야합니다.

$ cat q.c 
void foo(void **x) {} 
void bar(void) { foo((char **)0); } 
$ gcc -Wall -c q.c 
q.c: In function ‘bar’: 
q.c:2:1: warning: passing argument 1 of ‘foo’ from incompatible pointer type [enabled by default] 
q.c:1:6: note: expected ‘void **’ but argument is of type ‘char **’ 
$ gcc -v 
[...] 
gcc version 4.6.2 
+0

NB : 이것은 C.에 대해서만 사실입니다. G ++는 포인터에 관한 것이기 때문에 C++가 어떻게 작동해야하는지 알고 있습니다. – duskwuff

+0

정말입니까? 암시 적 변환이 불가능한 잘못된 인수 유형은 일반적으로 오류입니다. –

+1

@duskwuff : C와 C++의 문제에 대해 오해 한 것 같습니다. 예'void *'는 C에서는 암묵적으로'char *'로 변환되지만 C++에서는 암묵적으로 변환되지 않습니다. 그러나'void **'**는 ** 당신이 말하는 언어에 상관없이 암묵적으로'char ** '로 변환하지 않습니다. –

관련 문제