「C言語における可搬性(portability)の重要性」をプログラムでご紹介しよう。
まずは簡単な例である。
可搬性が悪いプログラム例
#include <stdio.h>
int main(void)
{
int i;
printf("サイズは: %d\n", sizeof(i)); // %dで表示
return 0;
}
問題点
- sizeof(i)はsize_t型(unsigned型)であるのに、%d(int型のフォーマット指定子)で表示している。
- 環境によっては警告が出たり、正しく表示されなかったりする。
- 32bit/64bitマシンで振る舞いが違うかもしれない。
用語
unsigned型とは、0以上の整数値を格納できるデータ型。負の数は表現できないが、符号付き整数型(signed型)よりも大きな範囲の正の数を扱えるというメリットがある。
size_t型は、オブジェクトのサイズをバイト数で表すために使われる符号なし整数型。
主にsizeof演算子の結果として使われる。
可搬性が高いプログラム例
#include <stdio.h>
#include <stddef.h> // size_tを使うために必要
int main(void)
{
size_t i;
i = sizeof(int);
printf("サイズは: %zu\n", i); // %zuはsize_t型用
return 0;
}
良い点
- size_t型を正しく使い、%zuを使って出力している。
- どんなプラットフォーム(Windows/Linux/Mac/32bit/64bit)でも同じように動く。
※C99 で新設された、size t 用の”%zu“という書式文字列を使用している。
さらに別の例をご紹介しよう
たとえば「数値が32bit固定」と思い込んで作られたコードもアウトである。
int x = 2147483648; // intの範囲を超えてるかも!
これは、「int型の最大値(2,147,483,647)」を超えてるので、環境によってはコンパイルエラーもしくは、謎の動作をする恐れがある。
対策として、
long long型にする。または、stdint.hのint64_tを使う。
用語
int型
・整数型は小数点以下の値を扱わず、整数値のみを格納する。
・メモリの占有量: 通常4バイト (32ビット)である。
・範囲はコンピューターのアーキテクチャによって異なるが、一般的に-2,147,483,648から2,147,483,647までの値が格納できる。
int64_t
64ビットの整数型。
int はもっとも標準的なbit数の整数。int のbit数はコンパイラが決めるので、コンパイラやシステムによって勝手にサイズが変わってしまう。
特定のbit数に依存したコードを書く場合には、int64_tのように固定のbit数を持つ変数型を使う。
プログラム例
#include <stdint.h>
#include <stdio.h>
int main(void) {
int64_t x = 2147483648LL;
printf("%lld\n", x);
return 0;
}
可搬性が高いコード
・標準ライブラリを使う
・正しいフォーマットを使う
・抽象的・規格に沿った書き方をする
可搬性 (portability) とは
ある環境 (ハードウェア環境やソフトウェア環境) から、別の環境への移行のしやすさを表すソフトウェア製品の能力のことをさす。
「私は××の処理系しか使わないので…」とか 「私はワークステーションしか使っていないので、パソコン用の処理系のことは関係ないので・・・」と可搬性の重要性を受け入れないプログラマが多いようである。 しかし、例えば、 一部の国のみに通用するパスポートと、 全世界に通用するパスポートを、 同程度の労力や出費で入手できるとしたら、 どちらを選ぶだろう。
プログラム開発時に、余計なコストがそれほどかからない範囲で構わないので、次のように心がけよう。
プログラムはできるだけ可搬性が高くなるように実現しよう
(参考)新·明解C言語 実践編 柴田 望洋 著 SBクリエイティブ
コメント