静的解析,構成管理,MISRA-C,コードレビュー,バグトラッキング,リバースエンジニアリング
ソフトウエア開発支援ツール
  SOFTWARE SOLUTIONS
 ソフトウェア開発における品質の向上、および生産性の向上を目指して、最適な開発支援ツールを提供します。
ソフトウエア開発支援ツール > 製品紹介 > 静的解析ツール QAC++ > 技術情報 > QA C++に特化した質問 > コンパイラ・パーソナリティに関するFAQ
コンパイラ・パーソナリティに関するFAQ
(GUI上でパーソナリティ・ファイルの内容を参照・編集する方法はこちらをご参照ください。)
質問1. 「依存基底クラスのルックアップ(-sdep+)」オプションの設定基準を教えてください。 全バージョン 戻る
回答1. コンパイラの中には、識別子の名前検索(ルックアップ) の範囲をクラス・テンプレートの基底クラスにまで 拡張するものと、そうでないものがあります。

お使いのコンパイラが、前者の挙動をする場合は、 「依存基底クラスのルックアップ(-sdep+)」オプション を設定する必要があります。後者の場合は、デフォルト(-sdep-)のままにします。

具体的には、お使いのコンパイラが次の ソースコードを エラーなくコンパイルできる場合は、-sdep+オプションを設定する必要があります。
  // Error ==> -sdep-  (default)
// Success ==> -sdep+
template<typename T> struct U {
typedef int result_type;
};

template<typename T> class B : public U<T> {
result_type fn(); // Problem
};

int main(void) { return 0; }
なお、設定方法は次の通りです。

GUIから設定する場合:
  [コンパイラ パーソナリティ][拡張] タブで
  [依存基底クラスのルックアップ]
  チェックボックスを選択します。

設定ファイルを直接編集する場合:
  -sdep+ と記述します。

質問2. 「テンプレート・パラメータを反映(-ptp+)」オプションの設定基準を教えてください。 全バージョン 戻る
回答2. コンパイラの中には、テンプレートの特殊化時に、その定義内で 特殊化元テンプレート定義のテンプレート・パラメータ名を 伝播して利用できるものと、そうでないものがあります。

お使いのコンパイラが、前者の挙動をする場合は、 「テンプレート・パラメータを反映(-ptp+)」オプション を設定する必要があります。後者の場合は、デフォルト(-ptp-)のままにします。

具体的には、お使いのコンパイラが次のソースコードをエラーなく コンパイルできる場合は、-ptp+オプションを設定する必要があります。
  // Error ==> -ptp-  (default)
// Success ==> -ptp+
template <class T> class C {
};

template <> class C<int> {
T I; // Problem
};

int main(void) { return 0; }
なお、設定方法は次の通りです。

GUIから設定する場合:
  [コンパイラ パーソナリティ][拡張] タブで
  [テンプレート・パラメータを反映]
  チェックボックスを選択します。

設定ファイルを直接編集する場合:
  -ptp+ と記述します。

質問3. 「関数テンプレート・ボディの解釈を遅らせる(-dpft+)」オプションの設定基準を教えてください。 全バージョン 戻る
回答3. コンパイラの中には、関数テンプレートの構文解析をテンプレートの インスタンスが作成される時点まで遅らせているものと、そうでない ものがあります。

お使いのコンパイラが、前者の挙動をする場合は、 「関数テンプレート・ボディの解釈を遅らせる(-dpft+)」オプション を設定する必要があります。後者の場合は、デフォルト(-dpft-)のまま にします。

具体的には、お使いのコンパイラが次のソースコードをエラーなく コンパイルできる場合は、-dpft+オプションを設定する必要があります。
  // Error ==> -dpft-  (default)
// Success ==> -dpft+
class C {
public:
template <class T> void foo(){
u8 my_u8;
}
};

typedef unsigned int u8;
void bar()
{
C c;
c.foo<int>(); // Problem
}

int main(void) { return 0; }
なお、設定方法は次の通りです。

GUIから設定する場合:
  [コンパイラ パーソナリティ][拡張] タブで
  [関数テンプレート・ボディの解釈を遅らせる]
  チェックボックスを選択します。

設定ファイルを直接編集する場合:
  -dpft+ と記述します。

質問4. 「friend名を導く(-ifn+)」オプションの設定基準を教えてください。 全バージョン 戻る
回答4. コンパイラの中には、friend宣言を前方宣言と同様に扱い、 friend宣言で使用された識別子を名前検索時に使用できる ようにしているものと、そうでないものがあります。

お使いのコンパイラが、前者の挙動をする場合は、 「friend名を導く(-ifn+)」オプション を設定する必要があります。後者の場合は、デフォルト(-ifn-)のまま にします。

具体的には、お使いのコンパイラが次のソースコードをエラーなく コンパイルできる場合は、-ifn+オプションを設定する必要があります。
  // Error ==> -ifn-  (default)
// Success ==> -ifn+
class C {
friend void foo();
};

void bar() {
foo(); // Problem
}

void foo() {}

int main(void) { return 0; }
なお、設定方法は次の通りです。

GUIから設定する場合:
  [コンパイラ パーソナリティ][拡張] タブで
  [friend名を導く]
  チェックボックスを選択します。

設定ファイルを直接編集する場合:
  -ifn+ と記述します。

質問5. 「推定型が const/volatile 付きで異なる場合でもテンプレート引数の推定を成功とする(-accd+)」オプションの設定基準を教えてください。 QAC++2.1J以上 戻る
回答5. コンパイラの中には、適合するテンプレートを推定する際に、 テンプレート引数の型が const または voltile 修飾子の 有無のみで異なる場合でも推定成功とするものと、そうでない ものがあります。

お使いのコンパイラが、前者の挙動をする場合は、 「推定型が const/volatile 付きで異なる場合でも テンプレート引数の推定を成功とする(-accd+)」オプション を設定する必要があります。後者の場合は、デフォルト(-accd-)のまま にします。

具体的には、お使いのコンパイラが次のソースコードをエラーなく コンパイルできる場合は、-accd+オプションを設定する必要があります。
  // Error ==> -accd-  (default)
// Success ==> -accd+
template <typename T>
void foo(T&, T&) {}

void bar() {
int i;
const int j = 0;

foo(j, i); // Problem
}

int main(void) { return 0; }
なお、設定方法は次の通りです。

GUIから設定する場合:
  [コンパイラ パーソナリティ][拡張] タブで
  [推定型が const/volatile 付きで異なる場合でもテンプレート引数の推定を成功とする]
  チェックボックスを選択します。

設定ファイルを直接編集する場合:
  -accd+ と記述します。

質問6. 「一時オブジェクトの非 const 参照への結合を許可する(-atncrb+)」オプションの設定基準を教えてください。 QAC++2.1J以上 戻る
回答6. コンパイラの中には、一時オブジェクトを const 参照でない 型に受け渡せるものと、そうでないものがあります。

お使いのコンパイラが、前者の挙動をする場合は、 「一時オブジェクトの非 const 参照への結合を許可する(-atncrb+)」オプション を設定する必要があります。後者の場合は、デフォルト(-atncrb-)のまま にします。

具体的には、お使いのコンパイラが次のソースコードをエラーなく コンパイルできる場合は、-atncrb+オプションを設定する必要があります。
  // Error ==> -atncrb-  (default)
// Success ==> -atncrb+
class C {};

void foo(C&) {}

void boo()
{
foo(C()); // Problem
}

int main(void) { return 0; }
なお、設定方法は次の通りです。

GUIから設定する場合:
  [コンパイラ パーソナリティ][拡張] タブで
  [一時オブジェクトの非 const 参照への結合を許可する]
  チェックボックスを選択します。

設定ファイルを直接編集する場合:
  -atncrb+ と記述します。

質問7. 「std 名前空間をグローバル・スコープの別名として扱う(-sig+)」オプションの設定基準を教えてください。 QAC++2.1J以上 戻る
回答7. コンパイラの中には、std 名前空間内で宣言された 識別子をグローバル・スコープ内で宣言された識別子 のように扱う(逆も同様です)ものと、そうでないもの があります。

お使いのコンパイラが、前者の挙動をする場合は、 「std 名前空間をグローバル・スコープの別名として扱う(-sig+)」オプション を設定する必要があります。後者の場合は、デフォルト(-sig-)のままにします。

具体的には、お使いのコンパイラが次のソースコードをエラーなく コンパイルできる場合は、-sig+オプションを設定する必要があります。
  // Error ==> -sig-  (default)
// Success ==> -sig+
#include <string>

std::string s1("hello");
string s2("world"); // Problem

int main(void) { return 0; }
なお、設定方法は次の通りです。

GUIから設定する場合:
  [コンパイラ パーソナリティ][拡張] タブで
  [std 名前空間をグローバル・スコープの別名として扱う]
  チェックボックスを選択します。

設定ファイルを直接編集する場合:
  -sig+ と記述します。

質問8. 「非 C99 リテラル拡張ルールを使う(-duc99dilt+)」オプションの設定基準を教えてください。 QAC++2.1J以上 戻る
回答8. コンパイラの中には、C99言語規格に従って、LONG_MAX よりも大きな10進定数を long long 型として 扱うものと、既存のC++言語規格に従って unsigned long long 型 として扱うものがあります。

お使いのコンパイラが、後者の挙動をする場合は、 「非 C99 リテラル拡張ルールを使う(-duc99dilt+)」オプションをオフ(-duc99dilt-)に設定する必要があります。 前者の場合は、デフォルト(-duc99dilt+)のままにします。

具体的には、お使いのコンパイラが次のソースコードをエラーなく コンパイルできる場合は、-duc99dilt-オプションを設定する必要があります。
  // Error ==> -duc99dilt+  (default)
// Success ==> -duc99dilt-
void foo(int i) {}
void foo(unsigned long i) {}

void bar(void) {
foo(4294967295); // Problem
}

int main(void) { return 0; }
なお、設定方法は次の通りです。

  [コンパイラ パーソナリティ][拡張] タブで
  [非 C99 リテラル拡張ルールを使う]
  チェックボックスを非選択にします。

設定ファイルを直接編集する場合:
  -duc99dilt- と記述します。

質問9. 「常に直接初期化を使用する(-audi+)」オプションの設定基準を教えてください。 QAC++2.1J以上 戻る
回答9. コンパイラの中には、'T x = e;'という形式でクラスを 宣言した場合に、'T x(e);' と記述されたものと見なして 初期化するものと、'T x; x = e;' と記述されたものと 見なして初期化するものがあります。

お使いのコンパイラが、前者の挙動をする場合は、 「常に直接初期化を使用する(-audi+)」オプション を設定する必要があります。後者の場合は、デフォルト(-audi-)のままにします。

具体的には、お使いのコンパイラが次のソースコードをエラーなく コンパイルできる場合は、-audi+オプションを設定する必要があります。
  // Error ==> -audi-  (default)
// Success ==> -audi+
class A{};

class B {
public:
B(const A&) {}
};

class C {
public:
C(const B&) {}
};

void foo() {
A c1;
C c2 = c1; // Problem
}

int main(void) { return 0; }
なお、設定方法は次の通りです。

GUIから設定する場合:
  [コンパイラ パーソナリティ][拡張] タブで
  [常に直接初期化を使用する]
  チェックボックスを選択します。

設定ファイルを直接編集する場合:
  -audi+ と記述します。

質問10. 「メンバからメンバ・ポインタへの暗黙の型変換を許可する(-aicpm+)」オプションの設定基準を教えてください。 QAC++2.1J以上 戻る
回答10. コンパイラの中には、クラスのメンバ関数型から クラスのメンバ・ポインタ型への変換を許すものと、 そうでないものがあります。

お使いのコンパイラが、前者の挙動をする場合は、 「メンバからメンバ・ポインタへの暗黙の型変換を許可する(-aicpm+)」オプション を設定する必要があります。後者の場合は、デフォルト(-aicpm-)のままにします。

具体的には、お使いのコンパイラが次のソースコードをエラーなく コンパイルできる場合は、-aicpm+オプションを設定する必要があります。
  // Error ==> -aicpm-  (default)
// Success ==> -aicpm+
class X {
public:
void foo() {}
};

void (X::*func)() = X::foo; // Problem

int main(void) { return 0; }
なお、設定方法は次の通りです。

GUIから設定する場合:
  [コンパイラ パーソナリティ][拡張] タブで
  [メンバからメンバ・ポインタへの暗黙の型変換を許可する]
  チェックボックスを選択します。

設定ファイルを直接編集する場合:
  -aicpm+ と記述します。

質問11. 「非型実引数に対するヌルポインタ変換を許可する(-atanpc+)」オプションの設定基準を教えてください。 QAC++2.1J以上 戻る
回答11. コンパイラの中には、ヌルポインタをポインタ型の 非型テンプレート仮引数に実引数として渡せるものと、 そうでないものがあります。

お使いのコンパイラが、前者の挙動をする場合は、 「非型実引数に対するヌルポインタ変換を許可する(-atanpc+)」オプション を設定する必要があります。後者の場合は、デフォルト(-atanpc-)のままにします。

具体的には、お使いのコンパイラが次のソースコードをエラーなく コンパイルできる場合は、-atanpc+オプションを設定する必要があります。
  // Error ==> -atanpc-  (default)
// Success ==> -atanpc+
template <void *>
class C {};

void foo(void)
{
C<0> c; // Problem
}

int main(void) { return 0; }
なお、設定方法は次の通りです。

GUIから設定する場合:
  [コンパイラ パーソナリティ][拡張] タブで
  [非型実引数に対するヌルポインタ変換を許可する]
  チェックボックスを選択します。

設定ファイルを直接編集する場合:
  -atanpc+ と記述します。