C++で開発したい

プログラム言語としてC++で開発したいと考えています.

開発環境は
SH7269評価ボード,
μITRONOS:HI7000\,
HEW(Version 4.09.01.007)です.

ファイル:testcpp.hpp\,testcpp.cpp(C++で記述.以下記載例)をプロジェクトを追加しましたが,以下のエラーによりコンパイルができません.ご存知の方がいましたら,ご教示頂けないでしょうか.

[エラー]
C2500 (E) Illegal token \”Neko\”
C2500 (E) Illegal token \”{\”

[c++記載]
=以下 testcpp.hpp ==
class Neko
{
private:
int name;
public:
Neko();
void testcpp();
void testcpp2();
};
//(end of testcpp.hpp)

==以下testcpp.cpp==

#include \”testcpp.hpp\”

Neko::Neko(){}
void Neko::testcpp(){}
void Neko::testcpp2(){}
//(end of testcpp.cpp)

  • f_hashiさん

    私の環境ではf_hashiさんのサンプルでコンパイルエラーは発生しませんでした。

    インクルードパスが通っていないのではないでしょうか?

    特別なフォルダに格納しているのでしたら「ビルド」メニューの「SuperH RISC engine Standard Toolchain...」を開くと最初にインクルードファイルディレクトリについて表示されているので、こちらにパスを追加してください。

    ご確認ください。


    すと@embedded property
  • すとさん,f_hashiです.

    ご教示ありがとうございます.

    インクルードパスは通っていることを確認しました.
    しかし,同じエラーによりコンパイルできませんでした.
  • f_hashiさん

    > C2500 (E) Illegal token \”Neko\”

    が出ていることから\”Neko\”が定義されていない(字句として認識されていない)のがエラーの原因です。testcpp.cppを右クリックで単体コンパイルしても同じでしょうか?

    インクルードが通っているのにIllegal tokenが出るのは??です。

    試しに新規プロジェクトを作成してプロジェクトフォルダ直下に置いた上記2ファイルのみを登録、コンパイルしても状況は変わりませんか?


    すと@embedded property
  • すとさん,f_hashiです.

    >testcpp.cppを右クリックで単体コンパイルしても同じでしょうか?

    HI7000上で動作している環境で単体コンパイルした結果,問題なくコンパイル出来ました.

    >試しに新規プロジェクトを作成してプロジェクトフォルダ直下に置いた上記2ファイルのみを登録、コンパイルしても状況は変わりませんか?

    新規プロジェクトを作成して,HI7000上で動作していない環境では,問題なくビルドできました.

    しかし,HI7000上でtestcpp.hppをインクルードし,ビルドするとエラーが表示します.インクルードした状態のtask.cを以下に示します.

    = task.c =
    #include <machine.h>

    #include \”itron.h\”
    #include \”kernel.h\”
    #include \”kernel_id.h\”
    #include \”kernel_id_sys.h\”

    //インクルードするとエラーがでます.
    #include \”neko.hpp\”  

    void MainTask(VP_INT exinf);

    void MainTask(VP_INT exinf)
    {
     ext_tsk();
    }
  • f_hashiさん

    元のファイルが.cであるため、.hpp(cppの内容)をcコンパイラが解釈しようとしているためエラーとなっているのでしょう。

    強制的にcppとして処理するようlangオプションを指定すると解決しませんか?


    shc –lang=cpp test.c

    もしくは、task.cをtask.cppに変更してコンパイルしてみてください。

    ご確認ください。


    すと@embedded property
  • すとさん

    >強制的にcppとして処理するようlangオプションを指定すると解決しませんか?
    >もしくは、task.cをtask.cppに変更してコンパイルしてみてください。

    どちらも試してみましたが,「C2500 (E) Illegal token \”Neko\”」はでないものの,
    以下のエラーが表示されました.

    L2310 (E) Undefined external symbol \”_MainTask\” referenced in...

    リンクエラーということで
    C++ファイルをCで呼び出すにはということで調べた結果,
    extern 宣言をすると呼び出せるということが
    分かったので,以下の記述に変更しましたが,
    エラーが解決しませんでした.

    extern void MainTask(VP_INT exinf);



  • f_hashiさん

    こちらで宣言してもダメですか?

    extern \”C\” void MainTask(VP_INT exinf);



    すと@embedded property
  • すとさん

    度重なるご教示大変ありがとうございました.
    すとさんのご教示どおり,以下の記述をすることでエラーがなくなりました.
    extern \”C\” void MainTask(VP_INT exinf);

    加えて,cで記述したヘッダファイルを
    #ifdef __cplusplus
    extern \”C\” {
    #endif /* __cplusplus */
    (Cで記述)
    #ifdef __cplusplus
    }
    #endif /* __cplusplus */
    を付け加えることで,Cppファイル内でc関数を呼び出すことができ,問題なく,動作することができました.