C言語の引数

RL78
CS+ forCC
でソフトを作っています。
例えば、関数 void xxfunc(uint32_t, uint32_t) があったとします。

メインで、
  uint16_t  aa;
  uint16_t  bb;
 
  aa = 1000;
  bb = 6000;
 xxfunc(aa, bb);
でコンパイルします。

引数の型が合わないのでワーニングが出ると思いましたが出ませんでいた。
暗黙の型変換だと思います。
このような場合でもワーニングを出すことはできますか?

  • ega258さん
    インフォメーション・メッセージ出力を有効にするをはいにすると
    :M0523034:Conversion in argument
    :M0523034:Conversion in argument
    が出ます、これではいけないですか。
  • ありがとうございます。
    cs+では確認できました。
    e2studioでもできるのでしょうか?
  • ega258さん、こんにちは。NoMaYです。

    CC-RLにその機能は無い筈です。CC-RLのコンパイラのヘルプを見直しても見当たらないです、、、CC-RXと話がごっちゃになっているのでしょうか?それとも私の見落としなのかな?

    IKUZO wrote:
    > インフォメーション・メッセージ出力を有効にするをはいにすると

    ega258 wrote:
    > cs+では確認できました。

  • NoMayさん、IKUZOさん
    すいません。
    私の確認値が違いでした。
    NoMayさんのご指摘通り、やはりできなかったです。
    そもそも、CS+でもe2STUDIOでもできないのでしょうか?
    型違いの代入などは、コンパイラ側で確認ができると思うのですが
    なぜできないのでしょうか?
  • > 例えば、関数 void xxfunc(uint32_t, uint32_t) があったとします。
    >
    > メインで、
    > uint16_t aa;
    > uint16_t bb;
    >
    > aa = 1000;
    > bb = 6000;
    > xxfunc(aa, bb);
    > でコンパイルします。
    >
    > 引数の型が合わないのでワーニングが出ると思いましたが出ませんでいた。
    > 暗黙の型変換だと思います。

    警告が出る出ないはさておいて、この場合の暗黙の型変換に何か問題がありますか?
    暗黙の型変換すべてをなくしたいということであれば上記のコードは aa や bb の初期化も

    aa = (uint16_t)1000U;
    bb = (uint16_t)6000U;

    等とするべきと思いますが現実的とも思いません。
  • 要は、関数の引数がuit32_tなのでuint16_tのaaを代入する場合、
    「型があってませんよ」という警告を出してほしいという意味です。
    例では、そのまま代入しても害はないことは分かっています。
  • 無意味なことを要望されてるということですか
  • 整数の上位変換は変換前の値が保証されるため、たぶん警告を出すコンパイラ無いんじゃないでしょうか…

    以下は、適当に見つけたマイクロソフトのコンパイラの例です。

    [標準変換 | Microsoft Docs]()

    gccでも-Wconversionオプションつけると、型変換の警告が出るようになりますが、やはり上位変換については警告は出ませんね…

    $ cat test.c
    #include  <stdint.h>
    #include  <stdio.h>
    
    void xxfunc(uint32_t a, uint32_t b) {
            printf("%d, %d\n", a, b);
    }
    
    
    int main(void) {
            uint16_t aa;
            uint16_t bb;
    
            aa = 1000;
            bb = 6000;
    
            xxfunc(aa, bb);
    
            return 0;
    }
    $ gcc test.c -Wconversion
    $ gcc test.c -Wconversion -Wall 
     
  • > 要は、関数の引数がuit32_tなのでuint16_tのaaを代入する場合、
    > 「型があってませんよ」という警告を出してほしいという意味です。

    C とは異なり引数型の違いをエラーとしてくれる言語は存在するのでそちらの選択を検討されるのもひとつの手ではないかと思います。

    Swift Rust Ada

  • 例えば gcc では下記のような記述をすることで引数のサイズと符号の有無のチェック程度は可能です。

    #include <stdio.h>
    #include <stdint.h>
    #include <inttypes.h>
    #include <assert.h>
    
    #define xxfunc(x, y) \
    ({ \
        assert(sizeof(x) == sizeof(uint32_t)); \
        assert((typeof(x))-1 == (uint32_t)-1); \
        assert(sizeof(y) == sizeof(uint32_t)); \
        assert((typeof(y))-1 == (uint32_t)-1); \
        _xxfunc(x, y); \
    })
    uint32_t _xxfunc(uint32_t x, uint32_t y)
    {
        return x + y;
    }
    
    int main(void)
    {
        uint16_t aa = 1000;
        uint16_t bb = 6000;
        uint32_t cc = xxfunc(aa, bb);
        printf("%"PRIu16 " + %"PRIu16 " = %"PRIu32 "\n", aa, bb, cc);
    }
    

    Wandboxで実行

    gcc の拡張文法を使用していますが似たようなことは CC-RL 等でも可能でしょう。

    記述が煩雑になることとそもそもの話大きい型への暗黙の変換に問題があると思わないのでお勧めしません。