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

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

现在我使用静态断言(基于其他Web资源自制)来将sizeof()结果与各种常量进行比较。 虽然这有效但它远非优雅或快速。 我还可以创建变量/ struct的实例并查看映射文件,但这也比直接调用/命令/运算符更不优雅和快速。 此外,这是一个使用多个交叉编译器的嵌入式项目……因此,为目标构建和加载示例程序然后读出一个值比上述任何一个都更麻烦。

在我的情况下(旧的GCC), #warning sizeof(MyStruct) )在打印警告之前实际上并不解释sizeof()。

当我偶然发现这个时,我正在寻找类似的function:

是否可以在编译时打印出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]' 

比原来的建议稍微粗略一点,但也许有人知道更好的gcc可以想到更好的警告滥用。

所有你需要的是一个技巧,导致编译器抱怨一些编译时整数值被错误地使用,如重复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; } 

——构建开始:项目:cpptest,配置:调试Win32 —— cpptest.cpp c:\ work \ cpptest \ cpptest \ cpptest.cpp(29):错误C2196:大小写值’48’已经使用==========构建:0成功,1失败,0最新,0跳过==========

所以struct X的大小是48

我偶然发现了一个类似于Bakhazard 伟大解决方案的解决方案 ,而且这个解决方案产生了一个不那么详细的警告,所以你可能会发现它很有用:

 char (*__fail)(void)[sizeof(uint64_t)] = 1; 

这会产生错误消息

 Function cannot return array type 'char [8]' 

这是使用最新版本的clang(1)

你不能这样做,不能用结构。 在编译之前调用预处理器,因此甚至没有结构的概念; 你不能评估不存在/未定义的东西的大小。 预处理器会对转换单元进行标记,但它只是为了定位宏调用。

最接近的是依靠一些实现定义的宏来评估内置类型的大小。 在gcc中,您可以找到以下内容:

 gcc -dM -E -  

在我的系统中打印:

 #define __SIZE_MAX__ 18446744073709551615UL #define __SIZEOF_INT__ 4 #define __SIZEOF_POINTER__ 8 #define __SIZEOF_LONG__ 8 #define __SIZEOF_LONG_DOUBLE__ 16 #define __SIZEOF_SIZE_T__ 8 #define __SIZEOF_WINT_T__ 4 #define __SIZE_TYPE__ long unsigned int #define __SIZEOF_PTRDIFF_T__ 8 #define __SIZEOF_FLOAT__ 4 #define __SIZEOF_SHORT__ 2 #define __SIZEOF_INT128__ 16 #define __SIZEOF_WCHAR_T__ 4 #define __SIZEOF_DOUBLE__ 8 #define __SIZEOF_LONG_LONG__ 8 

在没有编写程序并执行它的情况下,您无需知道自定义结构的大小。