どうして、エラーにならないんだろう?

リカルドです。

Init_Port_C()  ; の括弧を忘れて、Init_Port_C ; と書きましたが、エラーになりません。

そのため、デバッグに時間が掛かりました。

Init_Port_C ; と書くと、どのように解釈されるのでしょう。

CS+を使っています。

  • C++ですと未定義の変数のエラーは代入処理があった場合にエラーになりますが、代入処理がないとエラーにならないでしょうね。
    しかも、同じシンボルの関数が存在するからリンクで参照が解決して実行ファイルもできてしまう。

    C言語でも関数ポインタの代入で関数名を使えるので関数名は関数のアドレスを参照できる便利なものですね。

  • わわいです

    > Init_Port_C()  ; の括弧を忘れて、Init_Port_C ; と書きましたが、エラーになりません。

    関数のかっこを抜かした関数名だけ、ってのはその関数のアドレスを示します。

    エラーにはなりませんが、これでワーニングは出ます。

    GCCなら、コンパイラオプションに -Wall を指定しましょう。

    これですべてのワーニングを表示してくれます。で、そういう場合にも警告メッセージは出してくれます。

    #ルネサスコンパイラではどういうオプションになるかはわかりません

    初心者だという自覚があるなら、ワーニングはすべて表示するようにして、エラー、ワーニングを全くでないようにコードを書きましょう。

    はなしはそれから、ですよ。

  • わわいさん、回答有難う御座います。

    >関数のかっこを抜かした関数名だけ、ってのはその関数のアドレスを示します。
    >エラーにはなりませんが、これでワーニングは出ます。

     アドレスと解釈した後はどうなるのでしょう?そのアドレス値を変数に書き込むとか、何か操作が有りますよね。
     
     コンパイル結果をテキストにコピーして、(Init_Port_C ; の書いて有る行番号)  で検索したのですが、ワーニングは無さそうです。
     逆アセンブルしてみると、Init_Port_C ; は無視でした。他の命令に変わる事も有りません。
     
     組み込み関数の setpsw_i() の括弧を外すと、エラーになります。そのファイルに書かれている関数だとエラーにはならないが、外部関数ではエラーになるようです。
     
     CS+コンパイラのエラー検出機能が不完全と言う事は無いですか?

     最初の投稿で C+ と書きましたが CS+ の間違いです。

  • C++じゃなくてCね。

    何もコードに処理がないのでコードは何もしないとコンパイラによって解釈されます。

    もし、当初の関数が引数があってret = Init_Port_C();とかやって終了ステータスを参照できるような呼び出しの時の括弧が抜けたらretは関数の戻り値ではなく関数のアドレスが代入されますが、Cの場合、警告オプションを使わないと型変換チェックがいい加減でそのまま関数のアドレス代入として実行されます。でも、今回のような無意味なコードに当たるものはRZだからGCCですよね?GCCならあると思う。少なくとも私のRAプロジェクトでは似たようなコードになった時に警告がでます。

    また、組み込み関数は関数とはちょっと違う。これはコンパイラが直接対応する機械語に変換する関数の形をした機械語命令です。()なしは当然エラーです。これには関数アドレスがそもそも存在しません。

    ところで投稿先がRZのフォーラムですが、setpsw_i()ってRXマイコンでは?しかもCC-RXコンパイラじゃないかと。

  • amamoto さん、回答有難う御座います。

    >ところで投稿先がRZのフォーラムですが、setpsw_i()ってRXマイコンでは?しかもCC-RXコンパイラじゃないかと。

     RX621とCS+を使っています。
     新しく質問するときに、誰かの質問をクリックして右上に現れる「+新規」から質問しています。

    >setpsw_i()ってRXマイコンでは?

     良く分かりますね。幅広く色々なCPUや開発装置を扱っているのですね。
     私は、H8/3052,RX621,HEW、CS+ ぐらいしか分かりません。ハードが専門です。

  • 新規ボタン、表示しているフォーラムグループ内に新規の投稿を作ります。「Forums &Groups」で関連するグループへ移動後「+新規」で投稿しましょう。


    またCS+はコンパイラではありません。統合開発環境です。コンパイラはCC-RXやGNU-RX(いわゆるGCCのRX版で、私は Open Source Tools For Renesas提供のものを指すときに使っています)です。そして今回の内容ですと、RXマイコン使用で、()忘れの関数があった時にコンパイル時に指摘してもらいたいが、どういったコンパイルオプションになるか?CS+はどこでCC-RXの設定をするのか?となるのかと思います。私はe2studioを使用するのでCS+については設定するGUIの箇所はよく分かりませんが、CC-RXならやりたいことは

    change_message=error

    オプションでのコンパイルでできると思います。言語の規格もC89/C99(動的な配列確保のような一部の機能は使えない)

    GNU-RXなら-Wallだと思います。びっくりするくらい警告されますよ。

    どのコンパイラでも言えますが、警告の場合、2回目はオブジェクトファイルができた状態でビルドをしてもコンパイラは動きませんので一度、クリーンしてのビルドをすることをお忘れなく。つまり、警告はCソースからオブジェクトファイル生成をやった時しかされないということです。

  • リカルドです。
     
    ●わわいさんの次の書き込みをヒントに、数字だけだったらどうなるのか試してみました。
     
    >関数のかっこを抜かした関数名だけ、ってのはその関数のアドレスを示します。
    >エラーにはなりませんが、これでワーニングは出ます。
     
     
    ●プログラムは次の通りです。
     
    void main (void) { 123 ; }
     
     
    ●結果は次の通りです。
     
    ========== 全リビルドの開始(2025年5月6日 12:19:30) ==========
    ------ ビルド開始(Study, DefaultBuild) ------
    >..\..\User_Files\C_Files\000_PowerON_Reset\000_PowerON_Reset.C
    >..\..\..\_Include\SYS_Section.SRC
    >DefaultBuild\Study.abs DefaultBuild\Study.mot
    W0561017:Paid license of CC-RX V3 is not found, and the evaluation period has expired. Please consider purchasing the product.
    W0561017:Paid license of CC-RX V3 is not found, and the evaluation period has expired. Please consider purchasing the product.
    Renesas Optimizing Linker Completed
    >..\..\User_Files\C_Files\000_PowerON_Reset\000_PowerON_Reset.C
    >..\..\User_Files\C_Files\000_PowerON_Reset\000_PowerON_Reset.C
    >DefaultBuild\Study.abs DefaultBuild\Study.mot
    W0561017:Paid license of CC-RX V3 is not found, and the evaluation period has expired. Please consider purchasing the product.
    M0560101:No stack information in "DefaultBuild\SYS_Section.obj"
    W0561017:Paid license of CC-RX V3 is not found, and the evaluation period has expired. Please consider purchasing the product.
    Renesas Optimizing Linker Completed
    ------ ビルド終了(エラー:0個, 警告:4個)(Study, DefaultBuild) ------
    ========== 終了しました(成功:1プロジェクト, 失敗:0プロジェクト)(2025年5月6日 12:19:32) ==========
     
     
    ●「 123 ; 」は、C言語的に意味が有るのでしょうか?
     
     エラーにならないのだったら、何か意味が有るのでしょうか?

  • 123; は言語仕様書で言う「副作用のない式文」であり、極めて妥当です。通常の「式文」は「副作用」を得るために用いますが、副作用が無い式を式文化しても問題ありません。

    で、「式」「式文」「副作用」とは何かって話になりますが、これは C 言語仕様書 ISO/IEC 9899 なり C++ 言語仕様書 ISO/IEC 14882 なりが決めている専門用語です。詳しい説明が必要なら言ってください。

    文法解釈上、全く問題ない正しいソースコードであるため、標準設定ではこのコートに対してたいていのコンパイラは警告を出しません。警告レベルを上げると指摘されるようになります。


    void func(void) {
    	123;
    }
    

    に対して ccrx の場合は

    $ ccrx -nologo -isa=rxv3 -message exprstat.c 
    exprstat.c(2):M0520174:Expression has no effect
    

    同様 gcc であれば

    $ gcc -c -Wall exprstat.c 
    exprstat.c: In function 'func':
    exprstat.c:2:9: warning: statement with no effect [-Wunused-value]
        2 |         123;
          |         ^~~
    

    となりました。警告レベル上げるのってやっぱり大事。

  • わわいです

    > エラーにならないのだったら、何か意味が有るのでしょうか?

    何もしない文、という意味があります。

    何もしないなら別に異常ってわけでもないんだからええんちゃうん、という考え方ですね

    void main(void)
    {
      int a=1;
      int b=2;
      b=a;
      return;
      a=3;
    }

    デバッグしながら試行錯誤してるとよくこんなコードになってしまったりします。ちょっとこれを実行して動作を確認したいなと思ってるときに、

    これをエラーで落とされたら、ちょっと困りますわな

  • cacao99 さん、回答有難う御座います。
     
     投稿するとモデレートで引っ掛かるので、一部削除します。
     
     
    ● >文法解釈上、全く問題ない正しいソースコードであるため、
     
     分かりました。意外ですね。
     
    ● >exprstat.c(2):M0520174:Expression has no effect
     
     M0520174 で検索すると、ルネサスの次の頁に有りました。
     
     (モデレート対策)chm/Compiler-CCRX.chm/Output/er_M_msglist(モデレート対策)
     
     
    ● >警告レベル上げるのってやっぱり大事。
    
     CS+の何処で設定するのか探しました。次の所を「はい」にしました。
    
    ・CS+の左のプロジェクト・ツリーから「CC-RXビルド・ツール」「コンパイル・オプション」「インフォメーションレベル・メッセージレベルを有効にする」「はい」
     
     すると、次のメッセージが表示されました。
     
     (モデレート対策):M0520174:Expression has no effect
     
     「M0520174:Expression has no effect」が行頭に無いので、見逃し易いですね。
     
     
    ● 「M0520174:Expression has no effect」は、警告では無かった
     
     結果は次のようになりました。
     
    ・結果  ビルド終了(エラー:0個, 警告:4個)(Study, DefaultBuild) 
     
     「W0561017:Paid license of CC-RX V3 is not found」が4個出て来るので、「 警告:4個」はこれらの事です。
     ですから「M0520174:Expression has no effect」は、「警告」には含まれないようです。
     
     
     以上、色々有難う御座いました。やっと疑問点が解決しました。