Почему выражение sizeof не является константой времени компиляции, такой как 2, 4, 8 и т. Д.?

Мой компилятор — последняя версия VC ++ 2013.

int main()
{
__declspec(align(4))           int n1 = 0; // OK.
__declspec(align(sizeof(int))) int n2 = 0; // error C2059: syntax error : 'sizeof'
}

Почему выражение sizeof не является константой времени компиляции, такой как 2, 4, 8 и т. Д.?

3

Решение

Вместо того, чтобы спрашивать:
Почему выражение sizeof не является константой времени компиляции, такой как 2, 4, 8 и т. Д.?

(потому что, на самом деле, это является постоянная времени компиляции, как в этих примерах. (: исключая массивы переменной длины из новых стандартов C, для которых оно должно быть выражением времени выполнения :))

Было бы лучше спросить:
Почему это так align(...) не принимает постоянную времени компиляции как выражение sizeof?

Microsoft определил __declspec(align(#)) принять только небольшой набор значений:
Увидеть: https://msdn.microsoft.com/en-us/library/83ythb65.aspx

«# — значение выравнивания. Допустимые значения — целые числа от 1 до 8192 (байт), например, 2, 4, 8, 16, 32 или 64».

Таким образом, даже с простыми константами допускается не просто любое значение. __declspec(align(7)) не будет позволено, так как это не степень 2. Даже простые выражения, такие как __declspec(align(4+4)) не допускаются

4

Другие решения

В стандарте C

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

Оператор sizeof возвращает размер (в байтах) своего операнда, который
может быть выражением или именем типа в скобках. Размер
определяется из типа операнда. Результатом является целое число. Если
тип операнда — тип массива переменной длины, операнд
оценивается; в противном случае операнд не оценивается и результат
целочисленная константа

0