2010-05-27 2 views
1

C 프로그램에서 정의한 매크로에 문제가있는 것 같습니다.매크로 정의는 MIPS와 인텔 C 컴파일러간에 호환됩니까?

이 소프트웨어를 컴파일하고 MIPS 컴파일러로 정상적으로 실행하십시오.

icc를 사용할 때 런타임에 "Segmentation fault"오류가 발생하지만 OK를 생성합니다.

64 비트 아키텍처 (인텔 플랫폼에서 -64 플래그 및 icc와 함께 MIPS, SGI에서)를 모두 컴파일했습니다.

시스템에서이 작업을 올바르게 수행하는 데 사용해야하는 마술 스위치가 있습니까? 나는 intel 컴파일러에 대한 경고를 켜 놓았고, 매크로가 호출되는 곳의 프로그램 중 어느 곳이든 경고를 던진다. 대개 매크로의 매개 변수 (int to char *) 또는 이와 유사한 것의 유형이 일치하지 않는 행을 따라 표시됩니다. 가 호출 얼마나 많은 기능을 기반으로 일련의 탭 번호가있는 로그 파일에 인쇄 - 여기

이 기본적으로 디버깅에 사용되는

#define DEBUG_ENTER(name) {tdepth++; 
if(tnames[tdepth] == NULL) tnames[tdepth] = memalign(8, sizeof(char)*MAXLEN); 
strcopy(tnames[tdepth],name); 
FU_DEBUG("Entering \n");} 

매크로를 일으키는 것입니다. (tdepth = 탭 깊이)

맨 페이지에서 확인해 보았습니다. memalign은 IRIX에서만 지원되는 것 같습니다. 이것은 내 문제 일 수 있습니다. 나는 그것을 추적 할 것이다.

+0

내가 매크로 코드 질문에서 것이다 게시 가정 해 봅시다? –

+0

몇 가지로 게시합니다. 다른 네트워크에 있습니다. – Derek

+1

매크로에 따라 다릅니다. 매크로는 단순히 지정된 코드로 확장되며 해당 코드는 이식 가능하지 않을 수 있습니다. (그리고 많은 경우 매크로는 아키텍처 의존적 인 코드를 위해 특별히 추상화 레이어로 사용됩니다.) 불쾌한 매크로 정의를 게시하십시오. – jamesdlin

답변

1

이것은 시스템의 "엔디안"과 관련이있을 수 있습니다. here을 보면 MIPS가 전환 가능한 엔디안을 갖고있는 것으로 보입니다. 올바른 엔디안을 이미 사용하고 있는지 확실하지 않지만, 그렇지 않은 경우에는 문제가있을 것입니다.

0

이것은 바이트 순서 문제 일 수 있습니다. MIPS는 빅 엔디 언일 수 있지만 인텔은 리틀 엔디안입니다.

+0

어떤 영향을 받습니까? 나는 명시적인 바이트 시프 팅이나 아무것도하지 않겠다. 보통 시스템 호출 (malloc, memset 등, 괜찮습니까?) – Derek

+0

요약 할 수있는 영향을받을 수있는 많은 것들이 있습니다. 시스템 호출은 괜찮지 만 매개 변수는 그렇지 않을 수 있습니다. 매크로를 게시 할 수 있다면 누군가가 문제를 아주 빠르게 지적 할 것이라고 확신합니다. –

+0

게시 됨 ... – Derek

0

tnamesint의 배열입니다. 포인터를 지정하는 경우 포인터 유형의 배열이어야합니다.이 경우 아마 char *이 적합 할 것입니다.

(또한, strcopy() 표준 기능은 아닙니다 - 당신은 당신이 strcpy()을 의미하지 않는다?)