RX62で__VA_ARGS_

初めて質問させていただきます。

mokkunと申します。

CS+でRX62をターゲットに開発を行っていますが、

__VA_ARGS__を使うとエラーになってしまいます。

 

CS+           : V6.00.00

コンパイラパッケージ : CC-RX V2.07.00

エラーメッセージ

    *** :E0520020:Identifier "__VA_ARGS__" is undefined ***

 

CC-RXのマニュアルのエラー一覧には

E0520969 : The identifier __VA_ARGS__ can only appear in the replacement lists of variadic macros.

とあるので使用できると思ったのですが、未定義なのでしょうか?

よろしくお願いいたします。

Parents
  • mokkunさん、こんにちは。NoMaYです。

    CC-RXは以下の規格に準拠しているようです。(私は、C++仕様の「互換性のある」「基づいて」という表現が微妙だなぁ、かつ、元々の「Visual C/C++ 6.0」の言語仕様が今では不明だなぁ、と思いました。)

    準拠する言語仕様 - CS+オンラインヘルプ > コンパイラ編 > コンパイラ言語仕様 > 基本言語仕様
    tool-support.renesas.com/autoupdate/support/onlinehelp/ja-JP/csp/latest/CS+.chm/Compiler-CCRX.chm/Output/ccrx04c0106y.html

    (1) C言語仕様 (lang=cオプション選択時)

    ANSI/ISO 9899-1990 American National Standard for Programming Languages -C

    (2) C言語仕様 (lang=c99オプション選択時)

    ISO/IEC 9899:1999 INTERNATIONAL STANDARD Programming Languages - C

    (3) C++仕様 (lang=cppオプション選択時) ← つまりEC++仕様を選択しなかった場合

    Microsoft(R) Visual C/C++ 6.0と互換性のある言語仕様に基づいています。


    それで、私はGoogle検索して知ったのですが、C++に関してはC++11という規格で__VAR_ARGS__は導入されたようですね。(Visual C/C++ 6.0よりもかなり後ですね。) ですので、CC-RXでは未実装なのだと思います。

    Google検索: C++ __VA_ARGS__
    www.google.co.jp/search?q=C%2B%2B+__VA_ARGS__

    可変長マクロ引数の話 - にっき(pseudo)
    d.hatena.ne.jp/DigitalGhost/20111205/1323098099

    ちなみに、デバッグ用printfに関しては__VAR_ARGS__を使う他に以下に書かれている小技もあるようですね。

    [prog] C99じゃないコンパイラで、可変引数付きデバッグ用マクロを定義する例
    d.hatena.ne.jp/Wacky/20060611/1150007606

    [C/C++] C におけるデバッグ出力のジレンマ - satosystemsの日記
    d.hatena.ne.jp/satosystems/20120810/1344573313

    [追記]

    ウィキペディアにMicrosoft Visual C++の項がありました。Visual C++ 6.0は1998年リリースだったようです。(この項の「4 製品バージョンと内部バージョン」の表を参照しました。)

    Microsoft Visual C++ - ウィキペディア
    ja.wikipedia.org/wiki/Microsoft_Visual_C%2B%2B

    あと、cpprefjp - C++日本語リファレンスというサイトに、このようなページもありました。

    コンパイラの実装状況 - cpprefjp
    cpprefjp.github.io/implementation-status.html

    可変引数が空でない場合のトークン置換 (C++20) - cpprefjp
    cpprefjp.github.io/lang/cpp20/va_opt.html

Reply
  • mokkunさん、こんにちは。NoMaYです。

    CC-RXは以下の規格に準拠しているようです。(私は、C++仕様の「互換性のある」「基づいて」という表現が微妙だなぁ、かつ、元々の「Visual C/C++ 6.0」の言語仕様が今では不明だなぁ、と思いました。)

    準拠する言語仕様 - CS+オンラインヘルプ > コンパイラ編 > コンパイラ言語仕様 > 基本言語仕様
    tool-support.renesas.com/autoupdate/support/onlinehelp/ja-JP/csp/latest/CS+.chm/Compiler-CCRX.chm/Output/ccrx04c0106y.html

    (1) C言語仕様 (lang=cオプション選択時)

    ANSI/ISO 9899-1990 American National Standard for Programming Languages -C

    (2) C言語仕様 (lang=c99オプション選択時)

    ISO/IEC 9899:1999 INTERNATIONAL STANDARD Programming Languages - C

    (3) C++仕様 (lang=cppオプション選択時) ← つまりEC++仕様を選択しなかった場合

    Microsoft(R) Visual C/C++ 6.0と互換性のある言語仕様に基づいています。


    それで、私はGoogle検索して知ったのですが、C++に関してはC++11という規格で__VAR_ARGS__は導入されたようですね。(Visual C/C++ 6.0よりもかなり後ですね。) ですので、CC-RXでは未実装なのだと思います。

    Google検索: C++ __VA_ARGS__
    www.google.co.jp/search?q=C%2B%2B+__VA_ARGS__

    可変長マクロ引数の話 - にっき(pseudo)
    d.hatena.ne.jp/DigitalGhost/20111205/1323098099

    ちなみに、デバッグ用printfに関しては__VAR_ARGS__を使う他に以下に書かれている小技もあるようですね。

    [prog] C99じゃないコンパイラで、可変引数付きデバッグ用マクロを定義する例
    d.hatena.ne.jp/Wacky/20060611/1150007606

    [C/C++] C におけるデバッグ出力のジレンマ - satosystemsの日記
    d.hatena.ne.jp/satosystems/20120810/1344573313

    [追記]

    ウィキペディアにMicrosoft Visual C++の項がありました。Visual C++ 6.0は1998年リリースだったようです。(この項の「4 製品バージョンと内部バージョン」の表を参照しました。)

    Microsoft Visual C++ - ウィキペディア
    ja.wikipedia.org/wiki/Microsoft_Visual_C%2B%2B

    あと、cpprefjp - C++日本語リファレンスというサイトに、このようなページもありました。

    コンパイラの実装状況 - cpprefjp
    cpprefjp.github.io/implementation-status.html

    可変引数が空でない場合のトークン置換 (C++20) - cpprefjp
    cpprefjp.github.io/lang/cpp20/va_opt.html

Children
No Data