不使用隐式/显式转换在C中查找端点

不使用隐式/显式转换在C中查找端点,c,endianness,C,Endianness,我期待着找到一种方法,使我能够在不使用隐式/显式强制转换、循环、开关、内置函数、宏的情况下找到endianness。我尝试过一个代码,但它使用显式强制转换 int is_little_endian(){ int temp = 1; return *(char *) temp;//Returns 1 if it's a little endian machine. } [编辑] 必须在不使用任何铸件的情况下进行。我找不到一个不用强制转换和使用宏就能实现的问题隐式转换这里指的是编译

我期待着找到一种方法,使我能够在不使用隐式/显式强制转换、循环、开关、内置函数、宏的情况下找到endianness。我尝试过一个代码,但它使用显式强制转换

int is_little_endian(){
    int temp = 1;
    return *(char *) temp;//Returns 1 if it's a little endian machine.
}
[编辑]

必须在不使用任何铸件的情况下进行。我找不到一个不用强制转换和使用宏就能实现的问题隐式转换这里指的是编译器自动转换。说从字符到整数。

为什么不试试

unsigned int i= 1;
char *p = &i;

if(*p)
    printf("Little endian\n");
else
    printf("Big endian\n");
没有所谓的“隐式强制转换”——强制转换是一个显式操作符。但是,如果你要寻找的是一种不检查对象表示的观察端点的方法,那就没有办法了。Endianness纯粹是表示的属性,而不是值的属性,因此如果您限制自己访问表示,它就不存在。这就是为什么大多数好的代码不应该关心endianness

如果您确实想欺骗和访问表示,但又不想让它看起来像演员,那么以下是一些想法:

int i = 1;
char c;
memcpy(&c, &i, 1);
c;
或:

或:

或者在引擎盖下使用任何可能为您做类似事情的库函数。如果您在POSIX系统或任何其他具有套接字操作的系统上,也可以执行以下操作:

htonl(1) != 1;

但是所有这些要么依赖于检查表示,要么依赖于实现中关于目标端性是什么的硬编码假设。

这是通过编译器本身完成的

int is_little_endian(void) {
#ifdef _LITTLE_ENDIAN
    return 1;
#else
    return 0;
#endif
}
当为little endian目标构建程序时,在build命令中定义_little_endian(通常通过添加-D_little_endian)。如果程序是为big-endian目标生成的,请在build命令(-D_-big-endian)中定义_-big-endian

上面的示例将让您在运行时知道它是否是为一个小的endian目标构建的

然而,由于endianness在运行时不太可能改变,我认为在运行时这样做没有多大价值。相反,利用C预处理器和通过命令行传入定义的能力来完成您需要的任务


希望这有帮助。

可能重复的
*(char*)temp-->
*(字符*)&temp以前不太可能没有人问过这个问题。不使用强制转换通常使用一个
union
来代替:
int是_little_endian(void){union endianness{char c[2];short s;}u;u.s=1;return(u.c[0]==1);}
。我不认为这是重复的。这里重要的新内容是OP要求在不使用“强制转换”的情况下执行此操作,这大概意味着“不访问对象的表示”,我认为以前没有解决过这个问题。@2501:这个问题的关键约束在哪里?你提到的重复的一个是关于获得答案的实用编译时方法;系统标题中的宏是可接受的答案。这里的问题是关于如何实际测量endianness,不一定是在编译时,但是在使用的语言功能上有一定的限制。之所以有宏是有原因的。@iharob是的,但展示了如何在不使用强制转换的情况下获得持久性:):)正如OPIt所要求的,这是一个很好的解决方法,但我仍然被禁止使用内部函数,在强制转换的同时使用宏。工会不是强制转换,但正如我所说的,我想你的意思是“接触表现”,而不是演员。在这种情况下,问题是无法解决的。不带表示的C没有endianness,就像Perl或Lua没有endianness一样。添加了另一种可怕的方式。:-)
htonl(1) != 1;
int is_little_endian(void) {
#ifdef _LITTLE_ENDIAN
    return 1;
#else
    return 0;
#endif
}