C言語の移植性を高める
#🌱
移植性のあるコードである方が開発コストを減らすことができる
32ビットデータモデル、64ビットデータモデルのどちらでコンパイルした場合でも正常に動くプログラムにすることができる
stdint.hの(u)int8_t、(u)int16_t、(u)int32_t、(u)int64_tを使ったコードを書く
stdint.hを使用した際にはprintfの書式指定子(%dや%luなど)が変化変化するためinttypes.hを使う
char型は使わず、uint8_tを使う
char型はパッと見、符号なしで扱われるかと思いきや符号ありであったり、誤ってバイト操作をしてしまいがち
メモリアドレスの計算をする際はuintptr_t、ptrdiff_tを使用する
printfの移植性を高める
エンディアン
エンディアンに強いコード
アライメント
構造体のアライメントの問題
64ビット化で変更の影響度が大きい場合#pragma pack(n)を使うとか
code:struct.c
#pragma pack(4)
struct bar {
int foo0;
int foo1;
int foo2;
long long bar;
};
#pragma options align=reset
関連
C規格
新しめなC言語の書き方
メモ
商用UNIX(Solaris、AIX、HP-UX)からLinuxへ移行する方法
アップグレード時のSolarisプラットフォームからLinuxプラットフォームへの移行
Linux on HP Integrity Servers 2006年1月 HP and HP Partner Use Only — Solaris向けLinuxポーティングガイド — Technical Guide
Making Code 64-Bit Clean
20 issues of porting C++ code to the 64-bit platform
A course on developing 64-bit C/C++ applications
2016年、C言語はどう書くべきか (前編) | POSTD
2016年、C言語はどう書くべきか (後編) | POSTD
『Modern C』
Google 64ビットへの移植性 | C++ スタイルガイド(日本語全訳) Google C++ Style Guide (Japanese)