FAQ

QA・C/QA・C++

QA·C/QA·C++に関するに関するFAQ

QWindowsで開発したコードを、Solaris/HP-UX/Linux版のQA·C/QA·C++で解析する ことはできますか?

FAQ ID:8

A
コンパイルに必要なすべてのヘッダファイルとソースファイルを Solaris/HP-UX/Linux環境にコピーして頂ければ解析することができます。
ただし、オペレーティングシステム自体がそもそもサポートしていない 機能(特にファイルシステム関連の機能)を解決することは できませんので、次の点に注意する必要があります。
  • Solaris/HP-UX/Linuxはファイル名やディレクトリ名の大文字/小文字 を区別します。同様にQA·C/QA·C++も区別します。
    このため、#include文で指定したヘッダファイル名が 大文字/小文字の違いも含めて、ファイルシステム上の ファイル名と一致しない場合に、ヘッダファイルを 見つけることができなくなります。
    このため、Solaris/HP-UX/Linux版のQA·C/QA·C++で解析 する場合は、ファイル名を変更するか、シンボリック リンクを作成して、#include文で指定したヘッダ ファイル名に一致するヘッダファイルが見つかる ようにする必要があります。
  • Solaris/HP-UX/LinuxとWindowsでは、絶対パスの表現方法 が異なります。#include文で指定したヘッダファイル名が 絶対パスで記述されている場合は、ヘッダファイルを見つける ことができなくなります。
    この場合は、絶対パスを相対パスに変更して、#include文 で指定したヘッダファイルが見つかるようにする必要が あります。
  • Solaris/HP-UX/LinuxとWindowsでは、テキストファイルに 使用される標準の文字コードが異なることがあるので、 QA·C/QA·C++の解析結果を表示したときなどに結果が文字化けする ことがあります。
    この場合は、QA·C/QA·C++のエンコーディング(-en)オプションを、 解析対象のソースファイルで使用されている文字コードに 一致させて解析する必要があります。
  • 回答を閉じる

    QSolaris/HP-UX/Linuxで開発したソースコードを、Windows版のQA·C/QA·C++で 解析することはできますか?

    FAQ ID:7

    A
    コンパイルに必要なすべてのヘッダファイルとソースファイルを Windows環境にコピーして頂ければ解析することができます。
    ただし、オペレーティングシステム自体がそもそもサポートしていない 機能(特にファイルシステム関連の機能)を解決することは できませんので、次の点に注意する必要があります。
  • Windowsはシンボリックリンクを扱うことができません。 同様にWindows版のQA·C/QA·C++もシンボリックリンクを扱うことが できません。
    このため、Windows版のQA·C/QA·C++で解析する場合は、 シンボリックリンクを 実際のファイルやディレクトリに置き換える必要があります。
  • Windowsはファイル名やディレクトリ名の大文字/小文字 を区別しません。同様にQA·C/QA·C++も区別しません。
    このため、コピー前の同じディレクトリの中に大文字/小文字 のみが異なるファイルやディレクトリが存在する場合は、 それらを異なるディレクトリの中に分けてコピーする 必要があります。
  • WindowsとSolaris/HP-UX/Linuxでは、絶対パスの表現方法 が異なります。#include文で指定したヘッダファイル名が 絶対パスで記述されている場合は、ヘッダファイルを見つける ことができなくなります。
    この場合は、絶対パスを相対パスに変更して、#include文 で指定したヘッダファイルが見つかるようにする必要が あります。
  • WindowsとSolaris/HP-UX/Linuxでは、テキストファイルに 使用される標準の文字コードが異なることがあるので、 QA·C/QA·C++の解析結果を表示したときなどに結果が文字化けする ことがあります。
    この場合は、QA·C/QA·C++のエンコーディング(-en)オプションを、 解析対象のソースファイルで使用されている文字コードに 一致させて解析する必要があります。
  • 回答を閉じる

    QC言語で記述されたコードをQA·C++で解析することはできないのでしょうか?

    FAQ ID:4

    A
    「CとC++のコードが混在している場合、 QA·CとQA·C++のどちらで解析すればよいのでしょうか?」に記載させて頂いた とおり、QA·C/QA·C++の開発元であるProgramming Research社は、 QA·C++をC++言語モードに対応するC++言語専用のツールに 位置づけています。

    解析対象のソースファイルの中に、C++言語で認められていないC言語固有の 文法が記述されていなかったとしても、ソースファイルからインクルード されているヘッダファイルの中に、C++言語で認められていないC言語固有の 文法が記述されている場合、それらの出現箇所で文法エラーが発生し、 解析が中断してしまいます。
    例えば、C言語では変数の型や関数の返却値の型を省略することが できますが、C++言語では型の省略は許されていません。

    このため、C言語で記述されたコードを解析する場合は、姉妹品のQA·Cをご利用ください。

    回答を閉じる

    QC++言語で記述されたコードをQA·Cで解析することはできないのでしょうか?

    FAQ ID:3

    A
    「CとC++のコードが混在している場合、 QA·CとQA·C++のどちらで解析すればよいのでしょうか?」に記載させて頂いた とおり、QA·C/QA·C++の開発元であるProgramming Research社は、 QA·CをC言語モードに対応するC言語専用のツールに 位置づけています。

    解析対象のソースファイルの中に、C++言語固有のキーワードや文法が記述されて いなかったとしても、ソースファイルからインクルードされているヘッダファイル の中に、C++言語固有のキーワードや文法が記述されている場合、それらの 出現箇所で文法エラーが発生し、解析が中断してしまいます。
    例えば、C++言語ではクラスを定義することができますが、 C言語ではクラスを定義することはできません。

    このため、C++言語で記述されたコードを解析する場合は、姉妹品のQA·C++をご利用ください。

    回答を閉じる

    QCとC++のコードが混在している場合、QA·CとQA·C++のどちらで解析すればよいのでしょうか?

    FAQ ID:1

    A
    ソースファイルの拡張子が .c の場合はQA·C、拡張子が .cpp (または .C など) の場合はQA·C++で解析してください(理由は後述の説明をご参照ください)。

    皆様がソフトウェア開発でお使いになっているC/C++コンパイラは、次の2種類のコンパイル手段を備えています。
  • C言語モードでコンパイルする手段
  • C++言語モードでコンパイルする手段
  • コンパイル手段を切り替える方法は、コンパイラスイートごとに異なり、
  • 呼び出すコンパイラのコマンド自体を切り替える
  • コンパイラに与えるオプションを切り替える
  • コンパイラが拡張子を判別して自動的に切り替える
  • といった方法が用いられています。

    これらの切り替えは、コンパイルするソースファイルごとに行われます。つまり、ある一つのソースファイルはその内容に関わらず、必ずC言語モードとC++言語モードのどちらか一方でコンパイルされます。
    言い換えると、ある一つのソースファイルの中には、(プリプロセッサを通した状態で)C言語に従った構文とC++言語に従った構文のどちらか一方だけしか記述できないということになります。

    「C言語と高い互換性をもつ構文」をC++言語モードでコンパイルされるソースコードの中に記述することはできます。その意味では、「CとC++のコードが混在している」ソースファイルを記述するという表現をすることはできます。
    しかし、この場合に記述できるのはあくまでも『C++言語に従った「C言語と高い互換性をもつ構文」』であって、『C言語に従った構文』ではありません。厳密に言えば「CとC++のコードが混在している」ソースファイルを記述することはできないということになります。

    皆様が開発しているアプリケーションの各ソースファイルには、 .c や .cpp (または .C )といった拡張子が付けられていると思います。通常、拡張子が .c の場合はC言語モード、拡張子が .cpp (または .C )の場合はC++言語モードでコンパイルされることを意図して開発されていて、お使いになっている統合開発環境の大半がこの前提で動作するようになってい るはずです。

    QA·C/QA·C++の開発元であるProgramming Research社は、QA·CをC言語モードに対応するC言語専用のツール、QA·C++をC++言語モードに対応するC++言語専用のツールに位置づけています。コンパイラや統合開発環境と同様にソースファイルの拡張子に従って、QA·CとQA·C++のどちらを使って解析するのかを区別してください。

    回答を閉じる

    Q「非型実引数に対するヌルポインタ変換を許可する(-atanpc+)」オプションの設定基準を教えてください。 QAC++2.1J以上

    FAQ ID:11

    A
    コンパイラの中には、ヌルポインタをポインタ型の 非型テンプレート仮引数に実引数として渡せるものと、 そうでないものがあります。

    お使いのコンパイラが、前者の挙動をする場合は、 「非型実引数に対するヌルポインタ変換を許可する(-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+ と記述します。

    回答を閉じる

    Q「メンバからメンバ・ポインタへの暗黙の型変換を許可する(-aicpm+)」オプションの設定基準を教えてください。 QAC++2.1J以上

    FAQ ID:10

    A
    コンパイラの中には、クラスのメンバ関数型から クラスのメンバ・ポインタ型への変換を許すものと、 そうでないものがあります。

    お使いのコンパイラが、前者の挙動をする場合は、 「メンバからメンバ・ポインタへの暗黙の型変換を許可する(-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+ と記述します。

    回答を閉じる

    Q「非 C99 リテラル拡張ルールを使う(-duc99dilt+)」オプションの設定基準を教えてください。 QAC++2.1J以上

    FAQ ID:8

    A
    コンパイラの中には、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- と記述します。

    回答を閉じる

    Q「std 名前空間をグローバル・スコープの別名として扱う(-sig+)」オプションの設定基準を教えてください。 QAC++2.1J以上

    FAQ ID:7

    A
    コンパイラの中には、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+ と記述します。

    回答を閉じる

    Q「一時オブジェクトの非 const 参照への結合を許可する(-atncrb+)」オプションの設定基準を教えてください。 QAC++2.1J以上

    FAQ ID:6

    A
    コンパイラの中には、一時オブジェクトを 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+ と記述します。

    回答を閉じる

    Q「推定型が const/volatile 付きで異なる場合でもテンプレート引数の推定を成功とする(-accd+)」オプションの設定基準を教えてください。 QAC++2.1J以上

    FAQ ID:5

    A
    コンパイラの中には、適合するテンプレートを推定する際に、 テンプレート引数の型が 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+ と記述します。

    回答を閉じる

    QQA・C、QA・C++をWindow7へインストールする際に注意する点はありますか? QA・C 7.2.1J ~ 8.1.1J、QA・C++ 2.5.1J ~ 3.0J

    A
    Windows7へQA・C、QA・C++をインストールしていただく際にに注意していただく点は2つあります。

    1. QA・C、QA・C++ のインストーラー を「管理者として実行」で実行
    QA・C、QA・C++インストールの際、インストーラをダブルクリックから起動した場合、管理者(Administrator権限)としてログインしていても、管理者としてインストールできていない場合があります。 インストーラのコンテキストメニューを右クリックから開き、「管理者として実行」(図1)を選択してインストールしてください。


    図1 コンテキストメニュー: 「管理者として実行(A)...」


    2. ユーザアカウント制御機能が効くフォルダをインストールフォルダに利用しない
    Windowsのユーザアカウント制御機能(UAC)によって C:\Program Filesや C:\Program Files (x86) 以下に、QACをインストールすると正しく動作しない場合があります。Cドライブ直下にC:\PRQA というディレクトリを作成し、その配下に QA・C、QA・C++ をインストールすることをお勧めします。

    回答を閉じる