本文に進む 日本−日本語
日本HPホーム 製品とサービス お客様サポート/ ダウンロード ソリューション ご購入の方法
≫ お問い合わせ
詳細検索オプション
日本HPホーム
HP C/ANSI C バージョン B.11.11.16 リリースノート > 第1章 HP C/ANSI C リリースノート

このバージョンの概要

≫ 

テクニカル ドキュメント

PDF版
フィードバック
ここから本文が始まります

 ≫ 目次

 ≫ 索引

この項では、このバージョンの HP C コンパイラで導入された新機能の概要を説明します。

バージョン B.11.11.16 の新機能

HP C コンパイラのバージョン B.11.11.16 では、次の新機能がサポートされました。

HP Code Advisor (ソースコード解析ツール)

このリリースでは、プログラマが C および C++ ソースコード内のさまざまなプログラミングエラーを検出するための新しいツール HP Code Advisor (cadvise) が追加されました。 このツールを使用すると、潜在的なコーディングエラー、移植に関する問題、セキュリティエラーなどを検出できます。

ツールを起動するには、コマンド行から /opt/cadvise/bin/cadvise を実行します。 このツールの各種オプションの使用方法については、HP Code Advisor のリリースノートを参照してください。

HP Code Advisor の最新バージョンは、次のサイトから無料でダウンロードできます。

http://www.hp.com/go/cadvise

__restrict (C99) キーワードの完全サポート

HP C バージョン B.11.11.16 は、array[__restrict] 表記法をサポートしています。 __restrict を配列の添え字として使用した場合、コンパイラは、配列内の要素が他のポインターにより変更されることは一切ないという前提で最適化を実行します。

名前のない構造体および共用体のサポート (MSVC および GCC)

このバージョンの HP C では、-Ae コンパイルモードにおける、名前のない構造体および共用体に対するサポートが強化されています。これは、現在のデフォルトのコンパイルモードです。 次の例は、名前のない共用体の構文とその利便性を示したものです。

enum Type {tp_none, tp_char, tp_int, tp_double};
struct Val {
enum Type tp;
union {
char c;
int i;
double d;
};};
void print_val(struct Val *valp){
switch (valp->tp) {
case tp_char:
printf("%c", valp->c);
case tp_int:
printf("%d", valp->i);
case tp_double:
printf("%lf", valp->d);
}
}

この例からわかるとおり、名前のない共用体のメンバーには、共用体の名前を指定することなく直接アクセスすることができます。 共用体のメンバーにアクセスする都度、共用体の名前を指定することが、コードの読解や理解の助けとならず、構文上の単なるオーバーヘッドとなる場合は、この方法が非常に有効です。

名前のない構造体の構文も同様で、その利便性も同じです。

UNIX 2003 標準のサポート

HP C ドライバが 11.31 上で UNIX 2003 標準をサポートするようになりました。 環境変数 UNIX_STD を 2003 に設定すると、HP C ドライバは適切なサポートオブジェクトを実行可能ファイルに自動的にリンクします (オブジェクトがシステム上に存在する場合)。 UNIX 2003 サポートオブジェクトをリンクすることにより、標準の C ライブラリ関数が UNIX 2003 標準に準拠した動作を行うようになります。

以下は、システム内に存在する UNIX 2003 構成ファイルを示したものです。

/usr/lib/unix2003.o                 (32ビット実行可能ファイル用)
/usr/lib/pa20_64/unix2003.o (64ビット実行可能ファイル用)

HP C コンパイラは、UNIX 1998 および 1995 標準をすでにサポートしています。

可変長配列メンバー (C99) のサポート

このバージョンの HP C は可変長配列メンバーをサポートしており、境界を指定しない配列構造体メンバーの使用が可能です。 可変長配列メンバーは、1 つ以上の名前付きメンバーを持つ構造体の要素となることができ、可変長オブジェクトへのアクセスに使用できます。 宣言には空の添え字を使用します。

例:

struct Foo { 
int a;
int b[]; /* A flexible array member. */
};

可変長配列メンバーには、以下の規則が適用されます。

  • 可変長配列メンバーは、構造体の最後のメンバーでなければなりません。

  • 構造体には、可変長配列メンバー以外に少なくとも 1 つの名前付きメンバーが含まれていなければなりません。

  • 可変長配列メンバーを含む構造体は、別の構造体のメンバーまたは配列の要素になることはできません。

  • 可変長配列メンバーを含む (または再帰的に含む) 構造体は、共用体のメンバーになることはできません。

可変長配列メンバーは、コマンド行からレコードを読み取って、可変長の情報を取り出すような場合に特に便利です。

たとえば、次のコード例について考えてみましょう。

#include <stdio.h>
#include <stdlib.h>

struct A {
int a;
int b[1];
};

int main() {
const int N = 10;
int i;
struct A* p = malloc(sizeof(struct A) +
sizeof(int) * (N - 1));
p->a = 100;
for (i = 0; i < N; i++)
p->b[i] = i;
printf("%d %d %d\n", p->a, p->b[0], p->b[N-1]);
return 0;
}

以下は、可変長配列メンバーを使うように修正したコードです。

struct A {
...
int b[];
};

int main() {
...
struct A* p = malloc(sizeof(struct A) +
sizeof(int) * N);
...
}
印刷用画面へ
プライバシー 本サイト利用時の合意事項
© 2006 Hewlett-Packard Development Company, L.P.