JavaScript is required to for searching.
ナビゲーションリンクをスキップ
印刷ビューの終了
Oracle Solaris Studio 12.3: C ユーザーガイド     Oracle Solaris Studio 12.3 Information Library (日本語)
search filter icon
search icon

ドキュメントの情報

はじめに

1.  C コンパイラの紹介

2.  C コンパイラ実装に固有の情報

3.  C コードの並列化

4.  lint ソースコード検査プログラム

5.  型に基づく別名解析

6.  ISO C への移行

6.1 基本モード

6.1.1 -Xc

6.1.2 -Xa

6.1.3 -Xt

6.1.4 -Xs

6.2 新しい形式の関数プロトタイプ

6.2.1 新しいコードを書く

6.2.2 既存のコードを更新する

6.2.3 併用に関する考慮点

6.3 可変引数を持つ関数

6.4 拡張: 符号なし保存と値の保持

6.4.1 若干の背景となる歴史

6.4.2 コンパイルの動作

6.4.3 例: キャストの使用

6.4.4 例: 同じ結果、警告なし

6.4.5 整数定数

6.4.6 例: 整数定数

6.5 トークン化と前処理

6.5.1 ISO C の翻訳段階

6.5.2 古い C の翻訳段階

6.5.3 論理的なソース行

6.5.4 マクロ置換

6.5.5 文字列の使用

6.5.6 トークンの連結

6.6 const と volatile

6.6.1 lvalue 専用の型

6.6.2 派生型の型修飾子

6.6.3 const は readonly を意味する

6.6.4 const の使用例

6.6.5 volatile の使用例

6.7 複数バイト文字とワイド文字

6.7.1 アジア言語は複数バイト文字を必要とする

6.7.2 符号化の種類

6.7.3 ワイド文字

6.7.4 C 言語の機能

6.8 標準ヘッダーと予約名

6.8.1 標準ヘッダー

6.8.2 実装で使用される予約名

6.8.3 拡張用の予約名

6.8.4 安全に使用できる名前

6.9 国際化

6.9.1 ロケール

6.9.2 setlocale() 関数

6.9.3 変更された関数

6.9.4 新しい関数

6.10 式のグループ化と評価

6.10.1 式の定義

6.10.2 K&R C の再配置の権利

6.10.3 ISO C の規則

6.10.4 括弧の使用

6.10.5 as if 規則

6.11 不完全な型

6.11.1 型

6.11.2 不完全な型を完全にする

6.11.3 宣言

6.11.4 式

6.11.5 正当性

6.11.6 例: 不完全な型

6.12 互換型と複合型

6.12.1 複数の宣言

6.12.2 分割コンパイル間の互換性

6.12.3 単一のコンパイルでの互換性

6.12.4 互換ポインタ型

6.12.5 互換配列型

6.12.6 互換関数型

6.12.7 特別な場合

6.12.8 複合型

7.  64 ビット環境に対応するアプリケーションへの変換

8.  cscope: 対話的な C プログラムの検査

A.  機能別コンパイラオプション

B.  C コンパイラオプションリファレンス

C.  ISO/IEC C 99 の処理系定義の動作

D.  C99 の機能

E.  ISO/IEC C90 の処理系定義の動作

F.  ISO C データ表現

G.  パフォーマンスチューニング

H.  Oracle Solaris Studio C: K&R C と ISO C の違い

索引

6.12 互換型と複合型

K&R C では (ISO C の場合はさらに顕著ですが)、同じ要素を参照する 2 つの宣言を同じでないものにできます。ISO C は、このような「ある程度似ている」型を示すために、「互換型」という用語を使用します。この節では、この互換型と、2 つの互換型を結合した結果である「複合型」を説明します。

6.12.1 複数の宣言

C プログラムが、各オブジェクトまたは関数の宣言を一度だけ許可されているとしたら、互換型は必要ありませんでした。しかし、同じ要素を参照する複数の宣言を許可するリンク、関数のプロトタイプ、および分割コンパイルには、このような機能が必要です。複数の翻訳単位 (ソースファイル) 間では、型の互換性の規則は 1 つの翻訳単位内のものとは異なります。

6.12.2 分割コンパイル間の互換性

各コンパイルはおそらく別々のソースファイルを参照するため、分割コンパイル間の互換型に対して、ほとんどの規則は事実上次のように構造化されています。

6.12.3 単一のコンパイルでの互換性

同じスコープ内の 2 つの宣言が同じオブジェクトまたは関数を記述するとき、この 2 つの宣言は互換型を指定しなければいけません。これら 2 つの型は次に、最初の 2 つと互換性を持つ、1 つの複合型に結合されます。

互換型は再帰的に定義されます。一番下は型指定子のキーワードです。これらの規則は、unsigned short は unsigned short int と同じであり、型指定子なしの型は int を持つものと同じであることを示します。ほかのすべての型は、派生元の型が互換性を持つときだけ、互換性を持ちます。たとえば、修飾子 const と volatile が同じであり、修飾されていない基底型が互換性を持つ場合、2 つの修飾型は互換性を持ちます。

6.12.4 互換ポインタ型

2 つのポインタ型が互換性を持つためには、この 2 つのポインタが指す型が互換性を持ち、2 つのポインタが同じように修飾されていなければいけません。ポインタの修飾子は * のあとに指定されることを思い出してください。次の 2 つの宣言は、同じ型 int への異なる修飾子を持つ 2 つのポインタを宣言しています。

int *const cpi;
int *volatile vpi;

6.12.5 互換配列型

2 つの配列型が互換性を持つためには、この 2 つの配列の要素の型が互換性を持たなければいけません。両方の配列の型のサイズが指定されている場合は、両方のサイズも一致しなければいけません。つまり、不完全な配列型 (「6.11 不完全な型」を参照) は、ほかの不完全な配列型とも、サイズが指定されている配列型とも互換性を持ちます。

6.12.6 互換関数型

関数が互換性を持つためには、次の規則に従います:

6.12.7 特別な場合

signed int は int と同じように動作します。ただし、ビットフィールドは例外の可能性があります。通常の int が unsigned 動作の量を示すことがあります。

列挙型は同じ整数型と互換性を持つ必要があります。移植可能なプログラムの場合、これは、列挙型が別の型であることを意味します。一般的に、ISO C 規格はこのように列挙型を扱います。

6.12.8 複合型

2 つの互換型から 1 つの複合型への作成も再帰的に定義されます。不完全な配列型や古い形式の関数型を使用することにより、互換型をお互いに異なるようにできます。同様に、複合型をもっとも簡単に記述するには、元の両方の型 (元の型のすべての使用可能な配列サイズとパラメータリストも含む) と型の互換性を持たせればよいでしょう。