История изменений
Исправление firkax, (текущая версия) :
А, я что-то упустил из виду: код запускать нельзя, хорошо, но компилятор то можно запустить ещё раз?
Пишем такую штуку (отдельный исходник) align_test.c:
typedef struct { char a; TYPE b; } _alignstruct_X;
#define ALIGN_OF_X ((unsigned long)&(((_alignstruct_X*)0)->b))
int a[(ALIGN_OF_X==TEST)?1:-1];
int main(void) { return 0; }
#!/bin/sh -e
TYPE="$1"
AMACRO="$2"
TEST=1
while ! gcc "-DTYPE=$TYPE" -DTEST=$TEST align_test.c -c -o /dev/null >> /dev/null 2>&1; do
TEST=`expr $TEST + 1`
if [ $TEST -gt 1000 ]; then
echo "something went wrong, can't check alignment of type \"$TYPE\"" 1>&2
exit 1
fi
done
echo "#define ALIGN_OF_$AMACRO $TEST"
Запускаешь:
./align_test.sh "unsigned long" ULONG >> config.h
Ну и для sizeof аналогично.
Учти, что для ненативных типов вроде size_t надо инклюдить ещё какой-то хедер в align_test.c, иначе он молча повисит несколько минут и напишет что ничего не вышло. Чтобы заранее выяснить, доступен ли такой тип при данных хедерах - можно поптыаться скомпилировать предварительно ещё один исходник где этим типов просто переменная будет объявлена.
Исходная версия firkax, :
А, я что-то упустил из виду: код запускать нельзя, хорошо, но компилятор то можно запустить ещё раз?
Пишем такую штуку (отдельный исходник) align_test.c:
typedef struct { char a; TYPE b; } _alignstruct_X;
#define ALIGN_OF_X ((unsigned long)&(((_alignstruct_X*)0)->b))
int a[(ALIGN_OF_X==TEST)?1:-1];
int main(void) { return 0; }
#!/bin/sh -e
TYPE="$1"
AMACRO="$2"
TEST=1
while ! gcc "-DTYPE=$TYPE" -DTEST=$TEST align_test.c -c -o /dev/null >> /dev/null 2>&1; do
TEST=`expr $TEST + 1`
if [ $TEST -gt 1000 ]; then
echo "something went wrong, can't check alignment of type \"$TYPE\"" 1>&2
exit 1
fi
done
echo "#define ALIGN_OF_$AMACRO $TEST"
Запускаешь:
./align_test.sh "unsigned long" ULONG >> config.h
Ну и для sizeof аналогично.