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