Visual Studio sizeof() IntelliSense 与编译时的区别

Posted

技术标签:

【中文标题】Visual Studio sizeof() IntelliSense 与编译时的区别【英文标题】:Visual Studio sizeof() difference IntelliSense vs. compile-time 【发布时间】:2015-11-09 14:56:10 【问题描述】:

我的代码如下所示:

#include <stdio.h>

#pragma pack(1)
class MyClass

  bool a;
  bool b;
  int c;
  char d[3];
  bool e[4];
;
#pragma pack()

int main()

  printf("sizeof(MyClass)=%d\n", sizeof(MyClass));
  return 0;

输出是:

sizeof(MyClass)=13

但是当我“悬停”在sizeof(MyClass) 上时,我得到:

这不会是一个大问题,但我正在尝试实现编译时断言,但它不起作用(得到红色下划线):

有人知道如何解决这个问题吗?

【问题讨论】:

您问题的哪一部分与实际的编译时间有关?看来您的 UI/IDE 有问题。 IIRC 用于 IntelliSense 的编译器(处理这些鼠标悬停和下划线)与实际构建程序的编译器不同。他们的行为可能不同,在这种情况下显然是。 您可能已经对宏进行了投资,但我建议您使用 static_assert(condition),因为它是执行相同 IMO 的可移植方式。 @JoachimPileborg:是的,Intellisense 编译逻辑旨在处理格式错误的程序,即由半完成编辑产生的那种程序。 你刚刚破坏了我的答案,基本上是通过将它添加到问题中。 【参考方案1】:

这不是编译时和运行时的区别;这是您的编译器和 IDE 的“intellisense”之间的区别,后者似乎不支持/识别 #pragma pack 指令。

忽略它。大小为 13。

由于您可以实际构建程序,因此您知道编译时断言成功,尽管有“红线”。

可能值得在该断言之前添加一条注释,说明 Visual Studio 2015 的用户将在其 IDE 中看到以下断言的误报。

您可能还希望在 Microsoft Connect 上提出一个错误,如果还没有的话。

【讨论】:

是的,我认为这是 Visual Studio 中的另一个错误......“希望没人会注意到”类型的东西。 @rustyx 将#pragma pack() 移到main 函数后面,Intellisense 将显示正确的大小。看起来 Intellisense 确实检查了 #pragma pack() 指令 - 它只是没有正确执行。 @rustyx 所以,我刚刚用pack(2)sizeof(MyClass) 做了另一个测试,结果是14。看起来Intellisense 对sizeof 的评估总是使用pack size 它目前在里面。 @rustyx 还有一件事:alignof 的行为相同。 谢谢。这有助于这种简单化的场景,但我们的代码具有更大的结构,混合了不同的包,所以如果我在 sizeof() 之前定义 pragma pack(1),那么 IntelliSense 给出的值太低。

以上是关于Visual Studio sizeof() IntelliSense 与编译时的区别的主要内容,如果未能解决你的问题,请参考以下文章