2016-12-03 2 views
1

私はChip-8エミュレータをC言語で書いています。私の目標は可能な限り新旧のオペレーティングシステムと互換性があることです。正確なビット幅を表現するためのさまざまな種類のものが長年にわたって追加されています。このように、ショートカットを作成することができます(したがって、符号なしの文字/ロングをたくさん書く必要はありません)。数字は定義されていますか?そうでない場合は、これを行うためのより良い/より効率的な方法がありますか?Cで符号なしタイプのショートカットとしてtypedefを使用する

#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 

答えて

1

全体的な考え方は合理的です - 移植可能なコードを書いてください。 OPのアプローチはそうではありません。

  1. __uint8_tはC仕様で定義されていません。これを使用して移植可能なコードのコンパイルを誘導すると、不特定の動作につながる可能性があります。 ..._MAXの定義を使用する方がよいでしょう。

  2. コードでは、1つのプラットフォームでは固定幅タイプ、別のプラットフォームでは指定されていない幅に基づいてタイプを作成しています。良い計画ではありません。コードに固定幅タイプが必要な場合は、uint8_tなどの固定幅タイプを使用します。コードでunsigned charなどの短い手ucharなどを使用する場合は、#define uchar unsigned char以上を使用します。typedef unsigned char uchar;を使用します。

  3. <stdint.h>のないポータブル整数コードを作成しようとすると愚かです。ネイティブにファイルを持っていないコンパイラであっても、簡単に見つけることができるオンラインの外観があります。


ユーザーは、もともと掲示などの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; 
... 
+0

が、それはまた、常に念頭においての負担を作成し、そのオブジェクトは最小サイズより大きくなることがあります。 – giusti

1

プリミティブ型のサイズについては、何も仮定しないでください。それでもcharには8ビットがあります。この議論をチェックしてください:

What does the C++ standard state the size of int, long type to be?

私は、標準の整数型はかなりよくサポートされていると思います。 stdint.hをお持ちでない場合、相互互換性の可能性は私にとっては非常に暗いです。 stdint.hがコンパイラで利用できるようになることは、合理的な前提条件のようです。

1

はい、これは非常に良いアイデアです!プリミティブ型のサイズは決して想定しないでください。あなたが移植性のあるコードを書いているなら、これは保守性のために必要です!この小さなトリックは時間の節約になり、移植可能なコードベースを維持するための良い基盤を作るのに役立ちます。

関連する問題