有没有一种安全的、可移植的方法来确定(在编译期间)我的程序正在编译的平台的终结性?我在用C写.

[编辑]

推荐答案

This is for compile time checking

您可以使用boost头文件endian.hpp中的信息,它涵盖了许多平台.

edit for runtime checking

bool isLittleEndian()
{
    short int number = 0x1;
    char *numPtr = (char*)&number;
    return (numPtr[0] == 1);
}

创建一个整数,并读取其第一个字节(最低有效字节).如果字节为1,则系统为小端,否则为大端.

edit Thinking about it

是的,你可能会在一些平台上遇到潜在的问题(想不出有什么问题),比如sizeof(char) == sizeof(short int).您可以使用<stdint.h>中提供的固定宽度多字节整数类型,或者如果您的平台没有固定宽度的多字节整数类型,您也可以根据您的使用调整Boost标头:stdint.hpp

C++相关问答推荐

C sscanf没有捕获第二个参数

为什么这个select()会阻止?

使用SWI—Prolog的qsave_program生成二进制文件有什么好处?'

使用单个字节内的位字段

在struct中调用函数,但struct在void中 *

Malloc(sizeof(char[Length]))是否不正确?

LONG_DOUBLE_T是否存在(标准C:C23)

在列表中插入Int指针(C)

C++中矢量类型定义和数据保护的高效解决方案

Make Node函数.S有什么问题吗?

如何识别Linux中USB集线器(根)和连接到集线器(根设备)的设备(子设备)?

getline()从c中的外部函数传递指针时输出null

无法在OpenGL上绘制三角形

为什么我的半数组测试和奇数组测试不起作用?(我使用Assert进行调试)

如何在C中定义指向函数的指针并将该指针赋给函数?

计算SIZE_MAX元素的长数组的大小

正在try 理解C++中的`正在释放的指针未被分配‘错误

是否有单独的缓冲区用于读写库调用?

可以';t从A9G模块拨打电话

如何正确探测平台设备?