Как объявить массив, который соответствует размеру бита int в c? - PullRequest
0 голосов
/ 07 марта 2012

В основном мне нужно что-то вроде этого:

#if (sizeof(int) * CHAR_BIT) == 32
INT_MASKS[32] = {
    0x00000001, 0x00000003, 0x00000007, 0x0000000F,
    0x0000001F, 0x0000003F, 0x0000007F, 0x000000FF,
    ...
};
#elif (sizeof(int) * CHAR_BIT) == 64
INT_MASKS[64] = {
    0x0000000100000001, 0x0000000300000003, 0x0000000700000007, 0x0000000F0000000F,
    0x0000001F0000001F, 0x0000003F0000003F, 0x0000007F0000007F, 0x000000FF000000FF,
    ...
};
#else
    #error unsupported architecture
#endif;

В каждой ветке #if #else более одного массива, поэтому рабочий эквивалент сэкономил бы мне много места. Кроме того, некоторые массивы содержат множество выражений, которые я хотел бы оценить во время компиляции. Спасибо за любой ответ.

Ответы [ 3 ]

1 голос
/ 07 марта 2012

gcc и др. define __INT_MAX__ - вы можете использовать это для gcc и gcc-совместимых компиляторов, а затем, возможно, определить его явно для любых других компиляторов, которые вам нужно поддерживать:

#if __INT_MAX__ == 0x7fffffff
INT_MASKS[32] = {
    0x00000001, 0x00000003, 0x00000007, 0x0000000F,
    0x0000001F, 0x0000003F, 0x0000007F, 0x000000FF,
    ...
};
#elif __INT_MAX__ == 0x7fffffffffffffff
INT_MASKS[64] = {
    0x0000000100000001, 0x0000000300000003, 0x0000000700000007, 0x0000000F0000000F,
    0x0000001F0000001F, 0x0000003F0000003F, 0x0000007F0000007F, 0x000000FF000000FF,
    ...
};
#else
    #error unsupported architecture
#endif
0 голосов
/ 07 марта 2012

Обычно это делается для того, чтобы написать отдельную программу, которая генерирует объявления, чтобы избежать утомительной распечатки всех этих константных выражений.Например, объявление INT_MASKS может быть сгенерировано этим фрагментом кода:

int i, intbits = sizeof(int) * CHAR_BIT;
if (intbits == 32) {
    printf("unsigned INT_MASKS[%d] = {\n", intbits);
    for (i = 0; i < intbits; i++) {
        unsigned mask = (unsigned)(~0) >> (intbits - i - 1);
        printf("    0x%08x,\n", mask, mask);
    }
    printf("};\n", intbits);
} else if (intbits == 64) {
    int half = intbits / 2;
    printf("unsigned INT_MASKS[%d] = {\n", intbits);
    for (i = 0; i < intbits; i++) {
        unsigned mask = (unsigned)(~0) >> (half - (i%half) - 1);
        printf("    0x%08x%08x,\n", mask, mask);
    }
    printf("};\n", intbits);
}
0 голосов
/ 07 марта 2012

Как насчет этого?

1002 *
...