4

完全に移植可能で、特定のアーキテクチャに縛られないようにしたいCプログラム(C99またはC2011)を作成したいとします。

次に、古い整数型( int、、)とその仲間から完全に切り離し、、などのみを使用したいと思うようです(おそらく、とバージョンも使用します)。longshort int8_tuint8_tint32_tleastfast

それでは、リターンタイプはmain何ですか?それとも私たちは攻撃しなければなりませんintか?規格ではそうする必要がありますintか?

GCC-4.2で書くことができます

#include <stdint.h>
#include <stdio.h>
int32_t main() {
    printf("Hello\n");
    return 0;
}

でも使えない、uint32_tそれでもint8_t

hello.c:3: warning: return type of ‘main’ is not ‘int’

これは間違いなくtypedefによるものです。リターンタイプをターゲットアーキテクチャに任せない限り、実際には移植性がないため、これは不特定のサイズタイプを使用しなければならないという1つのケースのようです。この解釈は正しいですか?コードベースに「たった1つ」の古いものがあるのは奇妙に思えintますが、実用的であることを嬉しく思います。

4

2 に答える 2

9

完全に移植可能で、特定のアーキテクチャに縛られないようにしたいCプログラム(C99またはC2011)を作成したいとします。

次に、古い整数型(int、long、short)や友人から完全に脱却し、int8_t、uint8_t、int32_tなどのみを使用したいと思うようです(おそらく、最小バージョンと高速バージョンも使用します)。

太字のこれらの2つの断言は矛盾しています。これは、、、およびalが使用可能かどうかuint32_tuint8_t実際に実装定義されているためです(C11、7.20.1.1 / 3:正確な幅の整数型)。

プログラムを本当に移植可能にしたい場合は、組み込み型(int、、longなど)を使用し、C標準で定義されている最小範囲(C11、5.2.4.2.1:整数型のサイズ)に固執する必要があります。 )、

たとえば、標準では、両方shortとは少なくとも-32767から少なくともint32767の範囲である必要があるとされています。したがって、より大きな値またはより小さな値、たとえば42000を格納する場合は、代わりにを使用します。long

于 2013-02-12T15:24:49.480 に答える
6

の返品タイプはmain、規格intでC89、C99、およびC11にある必要があります。

現在、正確な幅の整数型は整数型のエイリアスです。したがって、適切なエイリアスを使用しても、int引き続き有効です。

例えば:

int32_t main(void)

ifint32_tは。へのtypedefintです。

于 2013-02-12T14:49:06.857 に答える