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 与编译时的区别的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 中快速创建方法 Generate a method in Visual Studio

Nodejs in Visual Studio Code 04.Swig模版

Nodejs in Visual Studio Code 03.学习Express

Nodejs in Visual Studio Code 01.简单介绍Nodejs

CMake Project in Visual Studio 2019

CMake Project in Visual Studio 2019