Вместо того, чтобы спрашивать: Почему выражение 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))
не допускаются.
В нем говорится «синтаксическая ошибка», поэтому, возможно, синтаксический анализатор ожидает числовую константу. На моей машине unix "int a [sizeof (int)];" на глобальном уровне компилируется нормально. –
Материал '__declspec' - это специальный синтаксис расширения MSVC, для которого у них есть набор [туманных правил] (http://msdn.microsoft.com/en-us/library/dabb5z75.aspx), и, очевидно, это не подлежащих стандартным правилам. В этом смысле я не думаю, что важно, является ли sizeof() 'константой времени компиляции или нет, потому что я думаю, что эти расширения обрабатываются вне остальной части компиляции (т. Е. Что-то между MACRO и правильная конструкция C++).Короче говоря, MSVC делает свои собственные правила здесь, и вам просто нужно жить с ними, если ему не нравится 'sizeof()', то вы не можете его там использовать. –
Похоже, что MS определяет оператор ['__alignof'] (http://msdn.microsoft.com/en-us/library/45t0s5f4.aspx) точно так, как вам кажется. Для простых типов он аналогичен 'sizeof', но он ведет себя несколько иначе для сложных типов, таких как structs и т. Д. – torak