加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C – 可移植地获取类型对齐

发布时间:2020-12-16 03:42:00 所属栏目:百科 来源:网络整理
导读:我正在为一个非常简单的语言编写一个非常小的解释器,它允许简单的结构定义(由其他结构和简单类型组成,如int,char,float,double等).我希望字段尽可能少地使用字段,因此使用max_align_t或类似的东西是不可能的.现在,我想知道是否有更好的方法来获得除此之外的
我正在为一个非常简单的语言编写一个非常小的解释器,它允许简单的结构定义(由其他结构和简单类型组成,如int,char,float,double等).我希望字段尽可能少地使用字段,因此使用max_align_t或类似的东西是不可能的.现在,我想知道是否有更好的方法来获得除此之外的任何单一类型的对齐:
#include <stdio.h>
#include <stddef.h>

#define GA(type,name) struct GA_##name { char c; type d; }; 
    const unsigned int alignment_for_##name = offsetof(struct GA_##name,d);

GA(int,int);
GA(short,short);
GA(char,char);
GA(float,float);
GA(double,double);
GA(char*,char_ptr);
GA(void*,void_ptr);

#define GP(type,name) printf("alignment of "#name" is: %dn",alignment_for_##name);

int main() {
GP(int,int);
GP(short,short);
GP(char,char);
GP(float,float);
GP(double,double);
GP(char*,char_ptr);
GP(void*,void_ptr);
}

这有效,但也许有更好的东西?

解决方法

这可能不是很便携,但GCC接受以下内容:
#define alignof(type) offsetof(struct { char c; type d; },d)

编辑:根据this answer,C允许转换为匿名结构类型(虽然我希望看到这个语句备份).所以以下应该是可移植的:

#define alignof(type) ((size_t)&((struct { char c; type d; } *)0)->d)

使用GNU statement expressions的另一种方法:

#define alignof(type) ({ 
    struct s { char c; type d; }; 
    offsetof(struct s,d); 
})

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读