2011-11-29 4 views
2

동일한 헤더를 포함하는 C로 작성된 두 개의 응용 프로그램이 있습니다. 이 헤더에는 struct 선언이 있습니다. GCC 컴파일러를 사용하여 두 응용 프로그램을 모두 컴파일합니다.sizeof는 같은 구조체에 대해 다른 값을 반환합니다.

두 응용 프로그램을 모두 실행하면 다른 값이 sizeof(struct-defined-in-the-header)이됩니다.

왜 이런 일이 발생합니까?

+0

몇 가지 이유가있을 수 있습니다. 두 가지 응용 프로그램의 차이점에 대한 추가 정보가 없으면 일부 추측이나 일부 일반적인 조언 만 얻을 수 있습니다. –

+0

그리고 이것이 구조체의 크기에 대한 가정을 할 수없는 이유입니다. – Kevin

+0

@ 케빈 : 이것은 약간 과장된 것입니다. 우리는 확실히'struct {char x, y; } '는 2보다 작지 않습니다. –

답변

6

우선 모든 것을 깨끗하게 빌드해야합니다.

문제가 지속되면 다른 번역 옵션이 두 번역 단위에 사용되었다는 것을 의미 할 수 있습니다. 두 가지 컴파일에 사용되는 gcc 명령 줄을 캡처하여 정렬, 구조 패딩 등과 관련된 옵션에 특히주의를 기울여 비교할 것입니다.

또 다른 가능성은 구조체의 정의가 일부 선행 처리기 기호 및 기호가 두 번역 단위에 대해 다르게 정의됩니다. gcc -E을 사용하고 두 개의 전 처리기 출력에서 ​​구조체 정의를 비교하는 것이 좋은 시작일 것입니다.

0

sizeof이 아니라이다. 이것은 컴파일 타임 연산자입니다.

어떤 헤더로 문제가 발생하는지 알 수 없습니다.

일부 선명한 전 처리기 트릭이 일부 필드를 제거하거나 필드의 실제 유형을 변경하는 것일 수 있습니다. 예를 들어, 헤더 foo.h

// in file foo.h 
#ifdef FOO_BAR 
typedef short number_t; 
#else 
typedef long number_t; 
#endif 

을 가지고 있으며, 다른 헤더 bar.h

// in file bar.h 
#define FOO_BAR 
#include "foo.h" 
struct barbare_st { 
    number_t num; 
    char name[20]; 
}; 

확인하려면, 당신은 전처리 된 형태로 보면 단순히 gdb 디버거의 ptype 명령을 사용하거나 할 수 있는지 상상 어떤 파일 중 xxx.i

으로 얻은 것
gcc -C -E -Dappropriate_defines -Iinclude_dirs/ xxx.c > xxx.i 
0

Eclipse를 사용하여 프로그램을 컴파일합니다. 나는 편집의 깃발을 확인했다. 봐 :

gcc -I/lib-header-directory-with-struct -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"program-a.d" -MT"program-a.d" -o"program-a.o" "../program-a.c" 

    gcc -I/lib-header-directory-with-struct -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"program-b.d" -MT"program-b.d" -o"program-b.o" "../program-b.c" 
    gcc -L/lib-directory-with-struct -o"program-b" -l<lib-with-struct> 

그들 사이의 차이점은 하나의 내가 lib 디렉토리를 사용하고 다른 내가 구조체 정의 만 사용한다는 것입니다.

gcc -E을 사용하고 stdout을 파일로 리디렉션했습니다. 이 파일에서 struct 정의를 찾았으며 두 프로그램 모두에서 동일합니다.

+0

원래 질문에 대한 답변이 아니기 때문에 질문에이 질문을 추가해야합니다. 그것은 편집 할 수 있습니다. –

0

Doc Brown이 주석을 달았으므로 몇 가지 가능성이 있습니다. 코드를 보여줘야합니다. 그래도 또 다른 추측이 있습니다.

다른 변수가 사례 중 하나에서 struct을 섀도 잉하고 있습니까? 에서와 마찬가지로 : 내 경우

extern struct { char foo; } bar; 

void baz(void) { 
    long bar; 
    sizeof bar; /* will be sizeof(long) */ 
} 

void qux(short bar) { 
    sizeof bar; /* will be sizeof(short) */ 
} 
1

는 GCC 아니었고 그것은 하나의 응용 프로그램은, 그러나 다른 .c 인 파일를 sizeof (MYSTRUCT)의 다른 결과가 있었다. 그 이유는 구조물의 포장 값이 다르기 때문입니다.C 파일에는 MyStruct 선언이있는 헤더를 포함하기 전에 .h 파일의 다른 세트가 포함되어있었습니다. 필자가 채택한 해결책은 적절한 포장 값을 설정하고 시스템 및 라이브러리 헤더 다음에 내 머리글 앞에 모든 .h 파일에 일반 머리글을 작성하는 것이 었습니다.

관련 문제