OpenWatcom/Changes_in_1.4

OpenWatcom/Changes_in_1.4

このへん→http://www.openwatcom.org/index.php/C_Compilers_Release_Changes

(それ以前の変更に比べて、)1.4 では注意を要する変更が多いような気がする。 ためしに(無断で)てきとーに日本語訳してみる。

  • 構造体や配列で C99 準拠の初期化サポート。
    例1. struct {int a, b;} c = {.a=0, .b=1};
    例2. int a[4] = {[0]=5, [3]=2};
  • 数値系の扱いを修正。数値型を扱う際に間違った型を選んでしまうことがあった。64ビット定数が使えるようになった(16bit 向けのコンパイラでも)。
    (いや待てよ、enumerated って数値型のことじゃなくてホントに "enum" 型 のことなのかな…?)
  • ビットシフトの際、左項のビット幅以上もしくは負の定数が指定された場合は警告('W134: Shift amount negative' もしくは 'W135: Shift amount too large')を出す。 このような場合の結果は ISO C において未定義である。
  • unsigned 型の数を <= 0 で比較した場合は警告を出す。 この場合は unsigned == 0 と同じ意味になるが、(このようなコードが書かれている場合は)符号比較を意図していることが多い。
  • キーワード __watcall 追加。 標準の Watcom C/C++ 呼び出し規約を表す。
  • コンパイラスイッチ -ec? 追加。デフォルトの呼び出し規約を指定する。
  • C++ コンパイラと一貫性を保つため、16 ビット C コンパイラも _M_I86 マクロを定義する。このマクロは M_I86 より優先的に使われる。
  • C コンパイラで以下のキーワード追加。以前はマクロで定義されていた。 _Cdecl, _Export, _Far16, _Fastcall, _Pascal, __sycall, _System, __try, __except, __finally, __leave
  • ほぼ同様に C++ コンパイラで以下のキーワード追加。以前はマクロで定義されていた。 _Cdecl, _Export, _Far16, _Fastcall, __inline, _Pascal, __syscall, _System
  • C++ コンパイラがテンプレートの特殊化(specialization)構文対応。 部分特殊化(partial specialization) は部分的にサポート(シャレではないです)。
  • C++ コンパイラは return 文なしで終わりに達した main() 関数を正しく扱える。 この場合 return 0; と同じ動作。
  • C++ コンパイラは、戻り値が void の関数で void を return できるようになった。 (つまり return void; と書ける、っていうこと?)
  • 386 の C/C++ コンパイラがマイクロソフトの fastcall 規約をサポート。 __fastcall キーワードが使える。
  • C コンパイラは #pragma data_seg と #pragma code_seg でセグメントとクラス名を括弧にくくらなくても受け入れる。 他のコンパイラとの一貫性のため。
  • C コンパイラに新スイッチ -fti 追加。 #include で開いたファイルを追跡できる。 複雑なプロジェクトでの include ファイルの問題調査で役に立つ。
  • -d1+ もしくは -d2 スイッチが指定されているとき、コードジェネレータは参照されていない型定義のデバッグ情報を出さない。 これでデバッグ情報はかなり小さくなる。 -d3 の動作に変更はない。
  • 686 向けの速度最適化を行うとき、386 コードジェネレータはゼロ拡張に and 命令を使わない。 レジスタストールを抑えられるし、P6 以上の CPU ではかなりパフォーマンスが向上しているので、つねに movzx を使う。
  • コードジェネレータで、long long ベースのビットフィールドのサポートが向上。
  • コードジェネレータは、シンボル名が OMF の制限(255 バイト)を超過しているかきちんと検査するようになった。
  • flat 以外の 386 メモリモデルで、セグメント情報の欠落に関連したコードジェネレータの問題がいくつか修正された。
  • コンパイル・リンクユーティリティ(wcl)における変更。 ファイル引数中の / はパス分離記号として使われ、たとえば "foo/bar" は "foo\bar.c" と解釈される。 これはオプション指定には影響を及ぼさない。
  • raw binary と Intel HEX 出力のサポートがリンカに追加。 それにともない、24 ビットセグメントアドレッシングアーキテクチャ(HSHIFT オプション)とクラス/セグメントの任意再配置(OUTPUT, ORDER ディレクティブ)をサポート。 詳細は Linker Guide 参照。
  • 16 ビットオーバレイのサポートがリンカにまた入った。 関連する FARCALLS/NOFARCALLS オプションがリンカに追加。 詳細は Linker Guide 参照。
  • リンカは絶対位置セグメント(absolute segment)内のシンボル配置を正しく処理できるようになった。
  • セグメントをグループに追加する際、リンカは 16 ビットセグメントと 32 ビットセグメントの衝突をチェックするようになった。
  • リンカが受け付ける OBJALIGN の最小値を 16 バイトに変更(以前は 512)。
  • PE モジュールのリンク時にリンカは個別の .bss セクションを作らなくなった。 そのかわり .data セクションの末尾に未初期化データが追加される。 これにより実行ファイルとメモリ使用量を小さくできる。
  • stat およびそれに関連する構造体から st_name メンバが除去された。 プラットフォーム間の一貫性を保つためにこうなった(UNIX にはこのようなフィールドはない)。 st_name フィールドがほとんど用を成さなかった(13 文字に制限されている)ためであり、マイクロソフトのコンパイラとの互換性のため、すなわち _wstat と _wstati64 の構造体が旧仕様となっており、構造体 _stat/_stati64 が stat 系関数のワイド文字版で使えるというのが残りの理由である。 NB: この変更は再コンパイルを要求する。 新しいオブジェクトファイルは以前のライブラリとリンクできないし、その逆も同様。
  • Win32 と 32bit OS/2 において、signal() 関数は FPU コントロールワードを変更しなくなった。 それにともない、SIGFPE のデフォルト値も全プラットフォームで SIG_IGN から SIG_DFL に変更された。
  • 浮動小数点の文字列変換ルーチンがより高精度になった。 このため C/C++ プログラムで表示した実数が以前のランタイムライブラリと異なることがある(しかし、より正確である)。
  • POSIX との互換性のため、sleep() 関数は unistd.h で定義、戻り値は unsigned int に変更。
  • clock() 関数は DOS と Windows でも(使えれば)ミリ秒カウンタを使う。 TZ の変更に関連する問題も解消。
  • より小さな実行ファイルが作れるよう、DOS ランタイムを見直し。
  • C ランタイムライブラリに C99 の関数 wmemchr(), wmemcmp(), wmemcpy(), wmemmove(), wmemset() 追加。
  • C ランタイムライブラリに POSIX 互換関数 getopt() 追加。
  • C ランタイムライブラリに POSIX 互換関数 mkstemp() 追加。
  • BSD 互換の文字列コピー/追加関数 strlcpy(), strlcat() 追加。 より安全かつ簡便に利用できるので、strncpy() や strncat() のかわりにこちらの利用を強くすすめる。
  • POSIX との互換性のため strings.h ヘッダ追加、なのだが、昔ながらの index() と rindex() 関数はサポートしていない。 他のコンパイラとの互換性のため、strcasecmp() と strncasecmp() は string.h にも定義されている。
  • O_APPEND フラグをつけてオープンしたデバイスとパイプへの書き込み時に C ランタイムライブラリは ESPIPE を返さなくなった。 以前の動作は POSIX 準拠ではなかった。
  • make ユーティリティ(wmake)で空白を含むパス名の扱いが改善。
  • 逆アセンブラ(wdis)がリトルエンディアンホスト上でビッグエンディアンのオブジェクトファイルを扱えるようになった。 その逆も同様。
  • 逆アセンブラに MIPS R4000 と SPARC V8 命令セットのサポートが追加された。
  • アセンブラ(wasm)に後方互換性のためのオプション -zz, -zzo 追加。 詳細は Tools User's Guide 参照。
  • インラインアセンブラのデフォルトの動作が変更された。 利用可能な命令セットは CPU 最適化レベルの指定(-4, -5, -6)に連動する。 -5 で MMX と 3DNow! が使え、-6 でさらに SSE/SSE2/SSE3 が使える。 上書き指定した CPU 指定は各インラインアセンブラブロックの終了時点ですべてデフォルトに戻されることに注意。
  • 16 ビット DOS 版アセンブラ(wasmr)追加。 これは 8086 上でも動き、プロテクトモード版より要求メモリが少ない。
  • デバッガは、デバッガ実行ファイルからの相対ディレクトリでサポートファイルを検索するように変更された。 デバッガ用の環境変数が定義されていなかったときでも、これでデバッガを使えるようになる。
  • デバッガで、デバッグ対象ロード直後に stepping into code (F8) を行ったときの問題が修正された。
  • デバッガは /DOwnload オプション指定時に .sym ファイル中のデバッグ情報を探すようになった。 以前は間違えて実行ファイルだけを見ていた。
  • デバッガとプロファイラに、MAPSYM ユーティリティが作った Microsoft/IBM .sym ファイルのサポートを追加。 IBM が OS/2 のシステム DLL 用に提供しているシンボルファイルでは特に有用である。 たとえば "call 01C74634" のかわりに "call DOS32EXIT" と逆アセンブルで表示してくれる。
  • CauseWay の trap ファイルは、実行ファイルが「大きい」(コードセグメントが 64K バイトを超えている)ときでもシンボルアドレスを正しくマッピングするようになった。
  • GNU ツールとの相互運用性向上。 デバッガ(wd/wdw)は GNU で作られた(DWARF-2 デバッグ情報を含んだ)実行ファイルもデバッグ可能。 そして逆もまた同様。
  • ライブラリマネージャ(wlib)に新オプション -zld 追加。 OMF オブジェクトから自動依存情報を除去するためのもの。
  • 新ユーティリティ exe2bin 追加。 詳細は Tools User's Guide 参照。
  • リソースコンパイラ(wrc)に、OS/2 リソーススクリプトのコンパイルと実行ファイル(NE,LX 両方)へのバインドのための基本サポートを追加。
  • リソースコンパイラの include 探索順を、IBM やマイクロソフトのリソースコンパイラはもとより C/C++ コンパイラともより一貫性を持つように変更。 システム include ファイル(<...> に括られたもの)はカレントディレクトリや #include 文の書かれたファイルのディレクトリを検索しなくなった。
  • Windows のリソースコンパイラが、文字列リテラルの扱いでマイクロソフトの RC 向けに書かれたスクリプトとより互換性を持つようになった。
  • MS LINK 互換ラッパーが /RELEASE スイッチをサポート。
  • エディタが makefile の構文ハイライトをサポート。 デフォルトの構文ハイライティングスキームがよりカラフルに。
  • エディタと Windows の GUI ツールが設定ファイルをより適切な場所に格納するようになった(特にマルチユーザマシンで)。
  • IDE に DOS エクステンダターゲットを新たにいくつか追加。 リモートデバッグのよりよいサポートを IDE に追加。
  • CauseWay DOS エクステンダが生 DOS 上で SSE 命令をサポートするようになった。
  • OS/2 SOM の簡単なプログラミング例をいくつか追加。

こんなもんでしょうか。