在C中使用typedef作为未签名类型的快捷方式

在C中使用typedef作为未签名类型的快捷方式,c,cross-platform,typedef,C,Cross Platform,Typedef,我正在用C编写一个Chip-8仿真器,我的目标是使它能够与尽可能多的不同操作系统兼容,新的和旧的。我意识到多年来增加了许多不同类型的用于表示精确位宽度的仿真器,因此,这样做是否合理,既可以创建一个快捷方式,这样我就不必编写大量未签名的字符/长字符,又可以解释已经定义了数字的编译器?如果没有,是否有更好/更有效的方法 #ifdef __uint8_t_defined typedef uint8_t uchar; typedef int8_t schar; typedef u

我正在用C编写一个Chip-8仿真器,我的目标是使它能够与尽可能多的不同操作系统兼容,新的和旧的。我意识到多年来增加了许多不同类型的用于表示精确位宽度的仿真器,因此,这样做是否合理,既可以创建一个快捷方式,这样我就不必编写大量未签名的字符/长字符,又可以解释已经定义了数字的编译器?如果没有,是否有更好/更有效的方法

#ifdef __uint8_t_defined
    typedef uint8_t uchar;
    typedef int8_t schar;
    typedef uint16_t ushort;
    typedef int16_t sshort;
#else
    typedef unsigned char uchar;
    typedef signed char schar;
    typedef unsigned short ushort;
    typedef signed short sshort;
#endif

您不应该对基本类型的大小做任何假设。甚至那个字符也没有8位。查看此讨论:


我认为标准整数类型得到了很好的支持。如果你没有stdint.h,那么你的交叉兼容性的机会在我看来非常渺茫。期望stdint.h可用于编译器似乎是一个合理的先决条件。

您不应该对原语类型的大小做出任何假设。甚至那个字符也没有8位。查看此讨论:


我认为标准整数类型得到了很好的支持。如果你没有stdint.h,那么你的交叉兼容性的机会在我看来非常渺茫。期望stdint.h可用于编译器似乎是一个合理的先决条件。

是的,这是一个非常好的主意!永远不要假定基本类型的大小。如果您正在编写可移植代码,这对于可维护性来说是必须的!这个小技巧将节省大量的时间,并有助于为便携式代码库的建立打下良好的基础。

是的,这是一个很好的主意。永远不要假定基本类型的大小。如果您正在编写可移植代码,这对于可维护性来说是必须的!这个小技巧可以节省大量的时间,有助于维护一个可移植的代码库。

总体思路是合理的——编写可移植代码。OP的方法并非如此

__uint8_t不是由C规范定义的。使用它来指导可移植代码的编译可能会导致未指定的行为。最好使用…\u MAX定义

代码基于一个平台上的固定宽度类型和另一个平台上的非指定宽度创建类型。这不是一个好计划。如果代码需要固定宽度类型,请使用固定宽度类型,如uint8_t等。如果代码希望对无符号字符使用简写uchar等,请使用define uchar unsigned char或更好的typedef unsigned char uchar

试图创建不带密码的可移植整数代码是愚蠢的。即使是本机没有该文件的编译器,也可以很容易地找到联机的相似项

如果用户仍希望创建uchar和朋友,如最初发布的,建议使用更便携的:

#include <stdint.h>

#ifdef INT_LEAST8_MAX
  typedef uint_least8_t uchar;
#else
  typedef unsigned char uchar;
#endif

#ifdef INT_LEAST16_MAX
  typedef uint_least16_t ushort;
...

总体思路是合理的——编写可移植代码。OP的方法并非如此

__uint8_t不是由C规范定义的。使用它来指导可移植代码的编译可能会导致未指定的行为。最好使用…\u MAX定义

代码基于一个平台上的固定宽度类型和另一个平台上的非指定宽度创建类型。这不是一个好计划。如果代码需要固定宽度类型,请使用固定宽度类型,如uint8_t等。如果代码希望对无符号字符使用简写uchar等,请使用define uchar unsigned char或更好的typedef unsigned char uchar

试图创建不带密码的可移植整数代码是愚蠢的。即使是本机没有该文件的编译器,也可以很容易地找到联机的相似项

如果用户仍希望创建uchar和朋友,如最初发布的,建议使用更便携的:

#include <stdint.h>

#ifdef INT_LEAST8_MAX
  typedef uint_least8_t uchar;
#else
  typedef unsigned char uchar;
#endif

#ifdef INT_LEAST16_MAX
  typedef uint_least16_t ushort;
...

这确实提高了可移植性,但也带来了一个负担,即始终记住对象可能大于最小大小。这确实提高了可移植性,但也带来了一个负担,即始终记住对象可能大于最小大小。