Мой компилятор — последняя версия 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 и т. Д.?
Вместо того, чтобы спрашивать:
Почему выражение 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))
не допускаются
В стандарте C
размер оператор не должен применяться к выражению, которое имеет
тип функции или неполный тип, в скобках имя такого
тип или выражение, которое обозначает элемент битового поля.
Оператор _Alignof не должен применяться к типу функции или к неполному типу.Оператор sizeof возвращает размер (в байтах) своего операнда, который
может быть выражением или именем типа в скобках. Размер
определяется из типа операнда. Результатом является целое число. Если
тип операнда — тип массива переменной длины, операнд
оценивается; в противном случае операнд не оценивается и результат
целочисленная константа