如何在C中编译时打印sizeof()的结果?
现在,我使用静态断言(基于其他web资源自制)来比较sizeof()结果与各种常量。在这个过程中..。它远不是优雅或快速的。我还可以创建一个变量/结构的实例并查看映射文件,但这也不如直接调用/命令/操作符那么优雅和快速。此外,这是一个使用多个交叉编译器的嵌入式项目...因此,构建一个示例程序并将其加载到目标,然后读出一个值,这比上面的任何一项都要麻烦得多。
在我的例子中(老的GCC),在打印警告之前,#warning sizeof(MyStruct)
实际上并不解释sizeof()。
发布于 2016-05-09 18:34:54
复制case
常量是一个确保在所有C编译器中工作的技巧,无论每个编译器如何报告错误。对于可视化C++,它很简单:
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;
}
编译结果:
------ Build started: Project: cpptest, Configuration: Debug Win32 ------
cpptest.cpp c:\work\cpptest\cpptest\cpptest.cpp(29): error C2196: case value '48' already used
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
因此结构X的大小是48
编辑(2020年6月3日):对于gcc或其他只打印“重复大小写值”的编译器,我使用这个技巧来缩小值的范围:
1)添加案例值1==2 (表示false)
2)通过反复试验,缩小值范围,例如,我尝试猜测sizeof(X)
>16:
#include <stdio.h>
typedef struct _X {
int a;
char b[10];
} X;
int main()
{
printf("Hello World");
int dummy=0 ;
switch (dummy) {
case 1==2:
case sizeof( X)>16:
//case 16:
break;
}
return 0;
}
结果:
main.c: In function ‘main’:
main.c:14:5: error: duplicate case value
case sizeof( X)>16:
^~~~
main.c:13:5: error: previously used here
case 1==2:
所以它是假的,即sizeof(X)<=16。
3)对其他一些合理的值进行重复。例如,试着猜测它是16,即sizeof(X)==16
。如果它不抱怨重复的case值。则表达式为真。
4)可选地添加一个case 16
来验证它,例如
#include <stdio.h>
typedef struct _X {
int a;
char b[10];
} X;
int main()
{
printf("Hello World");
int dummy=0 ;
switch (dummy) {
// case 1==2:
case sizeof( X):
case 16:
break;
}
return 0;
}
结果
main.c: In function ‘main’:
main.c:15:5: error: duplicate case value
case 16:
^~~~
main.c:14:5: error: previously used here
case sizeof( X):
确认sizeof(X)为16。
或者,可以观察到gcc可以报告多个重复,因此此技巧可以在单次传递中进行多个猜测:
#include <stdio.h>
typedef struct _X {
int a;
char b[10];
} X;
int main()
{
printf("Hello World");
int dummy=0 ;
switch (dummy) {
case 1==2: //represents false
case 1==1: //represents true
case sizeof( X)>10:
case sizeof( X)>12:
case sizeof( X)>14:
case sizeof( X)>16:
case sizeof( X)==16:
//case 16:
break;
}
return 0;
}
结果
main.c: In function ‘main’:
main.c:14:5: error: duplicate case value
case sizeof( X)>10:
^~~~
main.c:13:5: error: previously used here
case 1==1:
^~~~
main.c:15:5: error: duplicate case value
case sizeof( X)>12:
^~~~
main.c:13:5: error: previously used here
case 1==1:
^~~~
main.c:16:5: error: duplicate case value
case sizeof( X)>14:
^~~~
main.c:13:5: error: previously used here
case 1==1:
^~~~
main.c:17:5: error: duplicate case value
case sizeof( X)>16:
^~~~
main.c:12:5: error: previously used here
case 1==2:
^~~~
main.c:18:5: error: duplicate case value
case sizeof( X)==16:
^~~~
main.c:13:5: error: previously used here
case 1==1:
^~~~
建议sizeof(X)
>10,>12,>14,但不是>16。==16被添加为最终猜测。
发布于 2018-12-13 18:15:42
另一种方法(实际有效):
char __foo[sizeof(MyStruct) + 1] = {[sizeof(MyStruct)] = ""};
与老的gcc 5.x一起工作。会产生如下错误:
a.c:8:54: error: initializer element is not computable at load time
a.c:8:54: note: (near initialization for 'a[8]')
附注:显然,这一条是(非常)针对gcc的。所有其他方法对我都不起作用。
发布于 2020-11-21 04:59:46
对我有效的快速而简单的解决方案(GCC):
(char[sizeof(long long)])"bla";
这将导致显示long long
大小的错误消息
ISO C++ forbids casting to an array type 'char [8]'
https://stackoverflow.com/questions/20979565
复制相似问题