【发布时间】:2013-09-12 02:01:32
【问题描述】:
我的编译器是最新的 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 等那样的编译时常量?
【问题讨论】:
-
它说“语法错误”,所以解析器可能需要一个数字常量。在我的 unix 机器上“int a[sizeof(int)];”在全局级别编译正常。
-
__declspec的东西是 MSVC 特定的扩展语法,它们有一组 nebulous rules,显然,它不受标准规则的约束。从这个意义上说,我认为sizeof()是否是编译时常量并不重要,因为我认为这些扩展是在编译的其余部分之外处理的(即,介于 MACRO 和适当的 C++ 之间的东西构造)。简而言之,MSVC在这里制定了自己的规则,你只需要忍受它们,如果它不喜欢sizeof(),那你就不能在那里使用它。 -
看来 MS 定义了
__alignof运算符正是为了您想要的目的。对于简单类型,它类似于sizeof,但对于结构等复杂类型,它的行为有些不同... -
AFAICT 甚至
__declspec(align(4u))也是不允许的。这也是相当稳定的。
标签: c++ c visual-c++ sizeof compile-time-constant