コード生成で自作の typedef を許していないのでしょうか。

こんにちは SAM です。

これは、スマートコンフィグレータのコード生成でポートを使ったときの話です。
以下のような自作の型定義をして使おうとするとコンパイルエラーが出ます。

typedef enum
{
LIGHT_ON = 0,
LIGHT_OFF
} light_level_t;


自作のヘッダーファイルに定義しましたが Config_PORT.hでは、インクルードするヘッダーファイルを追加できず
r_cg_userdefine.h で定義するところにたどり着きました。
開発環境は問題ないのです。
light_level_t は r_cg_userdefine.h にあることを認識できます。

Config_PORT.cの内部では以下のようになっていてヘッダーファイルのインクルード順でエラーになります。

/***********************************************************************************************************************
Includes
***********************************************************************************************************************/
#include "r_cg_macrodriver.h"
#include "Config_PORT.h"
/* Start user code for include. Do not edit comment generated here */
/* End user code. Do not edit comment generated here */
#include "r_cg_userdefine.h"

せめて r_cg_userdefine.h が Config_PORT.h の上に記述できればコンパイルは通ると思うのです。
伺いたいのですが、コンパイラーの設定がどこかにあるのでしょうか。
そもそも、コード生成で自作の typedef を許していないのでしょうか。

私が未熟なのかもしれません。分かる方いらっしゃったらよろしくお願いします。

Parents
  • 肝心なことを書いていませんでした。

    具体的な例を挙げられずすみません。

    Config_PORT.h 関数のプロトタイプ宣言を記述した時に

    関数の戻り値に自作の型宣言したものを使うとコンパイルエラーになるということです。

    Config_PORT.h にヘッダーファイルを記述できないのは何か意図があるのかと思いました。

    開発環境ではどこに定義しているか参照できるのだから、コンパイラーだけの問題だと思うのです。

  • まだ、解決していないようなのでReplyします。

    IKUZO さんは、ユーザーコードの記述位置を

    /* Start user code for include. Do not edit comment generated here */
    /* End user code. Do not edit comment generated here */

    の間に記述していますかと聞かれているように思います。

    スマートコンフィグレータを使用した場合は、ユーザー記述領域以外に書かれたユーザーコードは無効にしたような記憶があります。(昔のことで定かではありませんが・・・)

    記述位置が正しくてもエラーが出るようであれば、エラーのメッセージ番号から原因が推測できると思います。

    私はスマートコンフィグレータを使っていませんが、試しに書いた以下のソースコードは正常にコンパイルできます。

    CS+ for CC V8.07.00 [01 DEC 2021] CC-RL V1.11.00

    ヘッダーファイル macro_definition.h
    typedef enum
    {
            LIGHT_ON = 0,
            LIGHT_OFF
    } light_level_t;

    ヘッダーファイル port.h
    extern light_level_t port_test(void);


    ソースファイル port.c
    #include "macro_definition.h”

    #include "port.h"
    ・・・・・・
    light_level_t port_test(void){
            light_level_t e_port;
            e_port = LIGHT_OFF;
            return e_port;
    }

  • >コンパイラーの設定がどこかにあるのでしょうか。

    御本人が確認している通り、記述の順番が問題なのでコンパイラの設定でどうこうなるものではないと思います。

    一会員さんみたいに「使わなきゃいいじゃん」も解決策なのですが、
    私なら「消されたらまた書けばいいじゃん」で、
    コード生成ボタンを押して記述が消される場所でも構わず書いてしまって
    (Start user code ~ End user code のコメントブロックの外側に書かれたコードは消されます)、
    消されたら戻す、でOKだと割り切ってしまうところです。
    必ずコンパイルエラーになるので消されたのに気づかないということもないだろうし。

    typedefだと記述の順番が問題になるので#defineで誤魔化すとか、
    他の手段を使えばもっとマイルドな方法で回避できるかもしれませんね。

Reply
  • >コンパイラーの設定がどこかにあるのでしょうか。

    御本人が確認している通り、記述の順番が問題なのでコンパイラの設定でどうこうなるものではないと思います。

    一会員さんみたいに「使わなきゃいいじゃん」も解決策なのですが、
    私なら「消されたらまた書けばいいじゃん」で、
    コード生成ボタンを押して記述が消される場所でも構わず書いてしまって
    (Start user code ~ End user code のコメントブロックの外側に書かれたコードは消されます)、
    消されたら戻す、でOKだと割り切ってしまうところです。
    必ずコンパイルエラーになるので消されたのに気づかないということもないだろうし。

    typedefだと記述の順番が問題になるので#defineで誤魔化すとか、
    他の手段を使えばもっとマイルドな方法で回避できるかもしれませんね。

Children
  • IKUZOさん、一会員さん、ほやさん ありがとうございました。
    「消されたらまた書けばいいじゃん」で行きます。

    Config_PORT.hより抜粋

    /***********************************************************************************************************************
    Includes
    ***********************************************************************************************************************/
    #include "r_cg_port.h"
    #include "r_cg_userdefine.h"


    #include "r_cg_userdefine.h" は、『コードの生成』で消えますので
    消えたら追加して『プロジェクトのビルド』でコンパイルでしのぎます。

    私が以前ここで問題にしたのですが、最新の e2studio は『すべてビルド』すると
    『コードの生成』を実行するんですよ。やめて欲しいのですが…。

    そういえば、開発環境が e2studio であることを記述していませんでした。
    重ね重ねすみませんでした。