Endian检查宏[英] Endian check macro

问题描述

大家好,
我试图编写一个宏来检查系统是大端还是小端
没有成功.不要误会我的意思,我写一个函数没有问题或
一个班轮做到这一点,但我试图在没有
的_macro_中做到这一点副作用(没有全局变量声明).我怀疑这不是
可能.

有人愿意证明我错了吗?
--
纪尧姆·达高
http://www.gdargaud.net/

推荐答案

Guillaume Dargaud 写道:
大家好,
我尝试编写一个宏来检查系统是大端还是小端
endian 没有成功.别误会,我写的没问题
一个函数或一个衬垫来做到这一点,但我试图在一个
_macro_ 没有副作用(没有全局变量声明).我
怀疑这是不可能的.

有人在乎证明我错了吗?
#include <stdio.h>

#define ENDIAN() { \
volatile unsigned long ul = 1;\
volatile unsigned char *p;\
p = (volatile unsigned char *)&ul;\
如果 (*p == 1)\
puts("Little endian.");\
否则 if (*(p+(sizeof(unsigned long)-1)) == 1)\
puts("Big endian.");\
else puts("Unknown endian.");\
}

int main(void) {
ENDIAN();
返回0;
}


"纪尧姆·达尔高"<我们**********************************@www.gdargaud.net>
写道:
我试图编写一个宏来检查系统是大端还是小端
没有成功.不要误会我的意思,我写一个函数没有问题或
一个班轮做到这一点,但我试图在没有
的_macro_中做到这一点副作用(没有全局变量声明).我怀疑这不是
可能.

有人在乎证明我错了吗?
在 C99 中,您可以使用复合文字来获得类似效果
你想要[1]:

(union {short n; char b[sizeof(short)];}){.n = 1}.b[0]

随心所欲地包装在一个宏中.unsigned char 可能会更好
一般,此代码存在一千个问题,但没有
你在做什么的一些细节,我不能再提出任何建议了
健壮.

[1] 我对测试字节序的代码很谨慎,因为我使用过
这两种机器都不是公认的
替代品.

--
Ben.

2008 年 7 月 8 日 11:35,santosh 写道:
#define ENDIAN() { \
volatile unsigned long ul = 1;\
volatile unsigned char *p;\
p = (volatile unsigned char *)&ul;\
如果 (*p == 1)\
puts("Little endian.");\
否则 if (*(p+(sizeof(unsigned long)-1)) == 1)\
puts("Big endian.");\
else puts("Unknown endian.");\
}
这是一个非常实用的解决方案,桑托什.我很惊讶没有人的
一直没有警告你 (volatile unsigned char *)&ul 可能
包含陷阱表示并取消引用它会导致 UB,或一些
胡说八道.


本文地址:https://www.itbaoku.cn/post/1050731.html