Is there a way to determine a member offset at compile time?

后端 未结 3 507
没有蜡笔的小新
没有蜡笔的小新 2020-12-19 15:57

I\'m finding I\'m spending a lot of time trying to determine member offsets of structures while debugging. I was wondering if there was a quick way to determine the offset

3条回答
  •  刺人心
    刺人心 (楼主)
    2020-12-19 16:45

    Ok, answering my own question here: Note: I'm looking to determine the offset at compile time, that is, I don't want to have to run the code (I can also compile just the files I need, and not the whole system): The following can be cut and paste for those who are interested:

    #include 
    
    #define offsetof_ct(structname, membername) \
    void ___offset_##membername ## ___(void) { \
            volatile char dummy[10000 + offsetof(structname, membername) ]; \
            dummy[0]=dummy[0]; \
    }
    
    struct x {
            int a[100];
            int b[20];
            int c[30];
    };
    
    offsetof_ct(struct x,a);
    offsetof_ct(struct x,b);
    offsetof_ct(struct x,c);
    

    And then run:

    ~/tmp> gcc tst.c -Wframe-larger-than=1000
    tst.c: In function ‘___offset_a___’:
    tst.c:16:1: warning: the frame size of 10000 bytes is larger than 1000 bytes
    tst.c: In function ‘___offset_b___’:
    tst.c:17:1: warning: the frame size of 10400 bytes is larger than 1000 bytes
    tst.c: In function ‘___offset_c___’:
    tst.c:18:1: warning: the frame size of 10480 bytes is larger than 1000 bytes
    /usr/lib/gcc/x86_64-redhat-linux/4.5.1/../../../../lib64/crt1.o: In function `_start':
    (.text+0x20): undefined reference to `main'
    collect2: ld returned 1 exit status
    

    I then subtract 10000 to get the offset. Note: I tried adding #pragma GCC diagnostic warning "-Wframe-larger-than=1000" into the file, but it didn't like it, so it'll have to be specified on the command line.

    John

提交回复
热议问题