C++でビルドエラー「E0520018:Expected a ")"」「E0520020:Identifier "__func__" is undefined」(RX231/CS+(CC-RX)/北斗電子製評価ボード)

いつもお世話になっております。

C/C++ソース混在プロジェクトなので、ビルドすると下記のエラーが発生します。

ご教授いただけると幸いです。

 

<ビルドエラー>

(1)E0520018:Expected a ")"

(2)E0520020:Identifier "__func__" is undefined


(1)の現象   ※便宜上、諸々削除し原因特定コードにしております。

/*-------------- VL53l0X.h -------------*/

=VL53l0X.h=
class VL53L0X
{
 public:
 VL53L0X(void);

 private:
 unsigned char address;
};

 

/*-------------- VL53l0X.cpp -------------*/

#include "VL53L0X.h"
#define U_VL53L0X_ADDRESS_DEFAULT  0b0101001

    

VL53L0X::VL53L0X(void)
: address(U_VL53L0X_ADDRESS_DEFAULT)    ★ここでエラー
{
}

 

【ビルドエラー】

E0520018:Expected a ")"

 

【コメント】

★を

#define U_VL53L0X_ADDRESS_DEFAULT (0b0101001)    ⇒同じエラー

#define U_VL53L0X_ADDRESS_DEFAULT 0101001      ⇒エラーがなくなります。

 

 

(2)の現象

/*-------------- C側のソース -------------*/

#define LOG(loglvl, tag, fmt, ...)   u_log(loglvl, tag, __FILE__, __LINE__, __func__, fmt, __VA_ARGS__) 

/*-------------- VL53l0X.cpp -------------*/

VL53L0X::test(void)
{

                :

  LOG(U_LOG_SILENT, U_LOG_TAG_VL53L0X, "OK \n", NULL);      ★ここでエラー

                :

 }

 

【ビルドエラー】

E0520020:Identifier "__func__" is undefined

 

 

【コメント】

『extern "C"』してもだめで、C++では__func__、__VA_ARGS__は使えないのでしょうか?

 

【その他】

・RX231/CS+(CC-RX)/北斗電子製評価ボード

・ビルドツールの設定は、C言語:C99(-lang=c99)、Cpp:C++(-lang=cpp)

   ライブラリジェネレートのC++の設定で何か有効にしなくてはならないのでしょうか?

 

以上、よろしくお願いいたします。

 

 

 

 

 

 

 

  • > ★を
    >
    > #define U_VL53L0X_ADDRESS_DEFAULT (0b0101001)    ⇒同じエラー
    >
    > #define U_VL53L0X_ADDRESS_DEFAULT 0101001      ⇒エラーがなくなります。

    gcc の様な 2進数表記をサポートしていないのであれば 8進数や 16進数に表記を改めれば良いのでは

    > 『extern "C"』してもだめで、C++では__func__、__VA_ARGS__は使えないのでしょうか

    __func__ 等は比較的最近に C から C++ に取り入れられた機能であり CC-RX でサポートされているかはマニュアルを参照されると良いでしょう。extern "C" はシンボル生成ルールを C に合わせるだけなので関係ありません。
  • 二進数リテラルは、C++14から追加された標準の機能で、コンパイラオプションでC++14又はC++17を指定する必要があると思います。
    ※CC-RXがC++14やC++17をサポートしていないと使えないと思います。
    ※言語拡張としてサポートしているかもしれません。
  • bunbunさん、こんにちは。NoMaYです。

    CC-RXのC++モードで__VA_ARGS__が使えない点に関しては、以下のスレッドが参考になるかと思います。

    RX62で__VA_ARGS_
    japan.renesasrulz.com/cafe_rene/f/forum5/4669/rx62-__va_args_/25585#25585

    2進数リテラルに関しては、既にリプライされているように8進数表記や16進数表記に変更するのが一般的かと思いますが、BinNum(0101001)のような感じで2進数表記を数値に変換する関数形式の#defineマクロを作成して使用することも出来るかと思います。(Google検索すると既にどなたかがブログ等に書いているかも知れません。)

    __func__に関しては、意図に近い挙動をするようなマクロを作成することは出来ませんので、CC-RXでは以下のようにして諦めることになるかと思います。

    #ifdef __cplusplus
    #define __func__ "<unknown>"
    #endif

     

  • 皆様、ご教授ありがとうございます。

    色々試した結果、(1)はHEX値に変更(2)はどうもCC-RXのC++では非対応のようでした
    (__FILE__などは有効でルネサスのマニュアルにも__func__は対応一覧に記載がありませんでした)


    っが現在、移植したC++ソースをプロジェクトに追加しビルドした所
    『E0520020:Identifier "class" is undefined 』とでるようになり、そもそもCベースのプロジェクトにC++を追加しても『class』すら識別してくれないという現象に陥ってしまいました。。。。

    ビルドツール設定は『Cpp:C++(-lang=cpp)』にしており、また追加したC++ファイルは、ビルド対象&C++ソースにはなっております。。。。

    WEBでいろいろ探しましたが、同じような現象がないようで、そもそも私が大きなちょんぼをしてそうですが
    時間がないのでC++をCに変更することも視野に考えております。。。
  • bunbunさん、こんにちは。NoMaYです。

    > 『E0520020:Identifier "class" is undefined 』とでるようになり、

    C++のclassの定義を含むヘッダファイル(.h)をCのソース(.c)でインクルードしてしまって、エラーになっている予感がします。こまめに、#ifdef __cplusplus や #ifndef __cplusplus でコンパイルされる/されないを、切り分けていかないといけないのではないでしょうか、、、

  • 御世話になっております。

    なるほどです。。。ちょっと見直してみます。
    いつもありがとうございます。

    取り急ぎ失礼致します。