为什么sizeof表达式不是像2,4,8等编译时常量?

时间:2013-09-12 02:01:32

标签: c++ c visual-c++ sizeof compile-time-constant

我的编译器是最新的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等?

2 个答案:

答案 0 :(得分:4)

而不是问: 为什么sizeof表达式不是编译时常量,如2,4,8等?

(因为实际上, 一个编译时常量就像那些例子一样。(:禁止来自较新C标准的可变长度数组,它必须是运行时表达式:))

最好问: 为什么align(...)不接受像sizeof表达式那样的编译时常量?

Microsoft将 __declspec(align(#)) 定义为仅接受一小组值: 请参阅:https://msdn.microsoft.com/en-us/library/83ythb65.aspx

  

“#是对齐值。有效条目是从1到8192(字节)的2的整数幂,例如2,4,8,16,32或64。”

因此即使使用简单的常量,也不允许任何值。 __declspec(align(7)) 是不允许的,因为它不是2的强项。即使是 __declspec(align(4+4)) 这样的简单表达也是不允许的。

答案 1 :(得分:0)

在C标准中

  

sizeof 运算符不应用于具有的表达式   函数类型或不完整类型,括号的名称   一个类型,或指定一个位字段成员的表达式。该   _Alignof运算符不应用于函数类型或不完整类型。

     

sizeof运算符产生其操作数的大小(以字节为单位)   可以是表达式或类型的带括号的名称。大小是   根据操作数的类型确定。结果是整数。如果   操作数的类型是可变长度数组类型,操作数   被评估;否则,不评估操作数和结果   是一个整数常量。