sizeof - 在C 中,如何在编译时打印 sizeof()的结果?

  显示原文与译文双语对照的内容
118 1

如何在编译时在编译时打印 sizeof()的结果?

现在我使用 static assert ( 基于其他网络资源的主页) 将 sizeof() 结果与各种常量进行比较。虽然这样很好。但还是不够优雅。我还可以创建变量/结构的实例,并且查看地图文件,但这也比直接 call/command/operator. 更优雅。因这里,建立和加载一个样例程序,然后读出一个值比上面的任何一个都更麻烦。

在我的案例( 旧 GCC ) 中,#warning sizeof(MyStruct) 在打印警告之前不会实际解释 sizeof() 。

时间:原作者:0个回答

108 3

当我遇到这个问题时,我在寻找类似的功能:

是否可以在编译时输出 C++ 类的大小

这让我想到了这样的想法:

char (*__kaboom)[sizeof( YourTypeHere )] = 1;

这将在VS2015中产生以下警告:

warning C4047: 'initializing': 'DWORD (*)[88]' differs in levels of indirection from 'int'

这里的88将是你正在寻找的大小。

超级hacky但是它能。可能已经过了几年了但希望这对某人有用。

我还没有机会试用gcc或者啁啾,但是我会试着确认它是否有效,如果有人在我前面。

编辑:clang 3.6的作品

我可以为GCC工作的唯一技巧是使用 -Wformat,并使宏定义如下所示的函数:

void kaboom_print( void )
{
 printf("%d", __kaboom );
}

这将给你一个警告,比如:

...blah blah blah... argument 2 has type 'char (*)[88]'

比原来的建议稍微粗略一些,但也许有人更好地认识到一个更好的警告。

原作者:
83 0

你所需要的只是一个技巧,使编译器抱怨某些编译时整数值不正确使用,如重复的case 常量:

struct X {
 int a,b;
 int c[10];
};
int _tmain(int argc, _TCHAR* argv[])
{
 int dummy;
 switch (dummy) {
 case sizeof(X):
 case sizeof(X):
 break;
 }
 return 0;
}

------生成开始:项目:controltemplate,配置:调试 WIN32 ------ cpptest.cpp c:workcpptestcpptestcpptest. cpp(29):错误 C2196: 案例值'48'已经使用==========生成:0成功,1失败,0 up-to-date,已经跳过 ========= =

那么结构X的大小是 48

原作者:
...