sizeof возвращает разные значения для одной и той же структуры - PullRequest
2 голосов
/ 29 ноября 2011

У меня есть два приложения, написанные на C, которые имеют одинаковый заголовок.В этом заголовке у меня есть объявление структуры.Я использую компилятор GCC для компиляции обоих приложений.

Когда я выполняю оба приложения, они выдают разные значения sizeof(struct-defined-in-the-header).

Почему это происходит?

Ответы [ 5 ]

6 голосов
/ 29 ноября 2011

Прежде всего, удостоверьтесь, что все собрано чисто.

Если проблема не устранена, это может означать, что для двух модулей перевода были использованы разные параметры компиляции.Я бы захватил командные строки gcc, используемые для двух компиляций, и сравнил бы их, обращая особое внимание на любые параметры, связанные с выравниванием, заполнением структуры и т. Д.

Другая возможность состоит в том, что определениеСтруктура зависит от некоторых символов препроцессора, и символы определяются по-разному для двух блоков перевода.Использование gcc -E и сравнение определения структуры в двух выходных данных препроцессора было бы хорошим началом.

1 голос
/ 24 февраля 2013

В моем случае это был не gcc, а одно приложение, но были разные результаты sizeof (MyStruct) в разных файлах .c.Причина была в разных упаковочных значениях для структур, потому что эти файлы .c включали разные наборы файлов .h, прежде чем включать заголовок с объявлением MyStruct.Решение, которое я принял, состояло в том, чтобы создать общий заголовок с установкой соответствующего значения упаковки и включением его во все мои файлы .h после заголовков системы и библиотеки, но до заголовков.

0 голосов
/ 30 ноября 2011

Как прокомментировал Док Браун, есть несколько возможностей.Вы должны показать код.Но вот другое предположение.

Может быть, другая переменная затеняет ваш 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) */
}
0 голосов
/ 30 ноября 2011

Я использую 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 и перенаправлял стандартный вывод в файл.Я искал определение структуры в этом файле, и оно одинаково в обеих программах.

0 голосов
/ 30 ноября 2011

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];
};

Чтобы узнать, вы можете использовать команду ptypegdb отладчик, или просто загляните в предварительно обработанную форму xxx.i некоторого файла xxx.c, полученного с помощью

gcc -C -E -Dappropriate_defines -Iinclude_dirs/ xxx.c > xxx.i
...