LINUX.ORG.RU

История изменений

Исправление 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; }
И скрипт align_test.sh:
#!/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; }
И скрипт align_test.sh:
#!/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 аналогично.