首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在C中编译时打印sizeof()的结果?

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

Stack Overflow用户
提问于 2014-01-08 02:57:27
回答 7查看 32.3K关注 0票数 75

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

现在,我使用静态断言(基于其他web资源自制)来比较sizeof()结果与各种常量。在这个过程中..。它远不是优雅或快速的。我还可以创建一个变量/结构的实例并查看映射文件,但这也不如直接调用/命令/操作符那么优雅和快速。此外,这是一个使用多个交叉编译器的嵌入式项目...因此,构建一个示例程序并将其加载到目标,然后读出一个值,这比上面的任何一项都要麻烦得多。

在我的例子中(老的GCC),在打印警告之前,#warning sizeof(MyStruct)实际上并不解释sizeof()。

EN

回答 7

Stack Overflow用户

发布于 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被添加为最终猜测。

票数 22
EN

Stack Overflow用户

发布于 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的。所有其他方法对我都不起作用。

票数 8
EN

Stack Overflow用户

发布于 2020-11-21 04:59:46

对我有效的快速而简单的解决方案(GCC):

(char[sizeof(long long)])"bla";

这将导致显示long long大小的错误消息

ISO C++ forbids casting to an array type 'char [8]'
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20979565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档