関数から (C/C++ で) 配列を返すことはできないと何度も読みましたが、その場合、int64_t
関数からどのように返すことができますか? int64_t
の配列だけではありませんlong int
か?
(はい、配列の先頭へのポインターを返すことができることは知っていますが、 ではなく を返すことについて話しているのですint[4]
。int*
)
int64_t は単なる long int の配列ではありませんか?
いいえ、int64_t
(配列型のような集約型とは対照的に) スカラー型のエイリアスであり、通常はlong long
型のエイリアスです。
もちろん、これはint64_t
、正確な幅の整数型が C でオプションとして定義されている場合に適用されます。
実際には、配列ではない任意の型を返すことができます。たとえば、4つのint値を返したい場合は、struct my_4ints { int x[4] };
ただし、int64_t(32ビットマシンの場合)は1つの「アイテム」です。x86では、通常はeax、edxの2つのレジスタ値として返されます。しかし、それでも1つの値が返されます。
配列を構造体でラップすると、関数から返すことができます。ただし、ABIはこの種のものでは完全に安定していないため、回避する必要があります(例:Solarisでgcc3.4でコンパイルされたオブジェクトにリンクされたgcc3.3でコンパイルされたオブジェクトは互換性がなく、その場合はクラッシュする可能性があります)。