Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page

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
    が出ます、これではいけないですか。
  • In reply to IKUZO:

    ありがとうございます。
    cs+では確認できました。
    e2studioでもできるのでしょうか?
  • In reply to ega258:

    ega258さん、こんにちは。NoMaYです。

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

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

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

  • In reply to NoMaY:

    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;

    等とするべきと思いますが現実的とも思いません。
  • In reply to fujita nozomu:

    要は、関数の引数がuit32_tなのでuint16_tのaaを代入する場合、
    「型があってませんよ」という警告を出してほしいという意味です。
    例では、そのまま代入しても害はないことは分かっています。
  • In reply to ega258:

    無意味なことを要望されてるということですか
  • 整数の上位変換は変換前の値が保証されるため、たぶん警告を出すコンパイラ無いんじゃないでしょうか…

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

    [標準変換 | 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 
     
  • In reply to ega258:

    > 要は、関数の引数がuit32_tなのでuint16_tのaaを代入する場合、
    > 「型があってませんよ」という警告を出してほしいという意味です。

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

    Swift

    Rust

  • In reply to ega258:

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

    #include <stdio.h>
    #include <stdint.h>
    #include <inttypes.h>
    #include <assert.h>
    
    #define xxfunc(x, y) \
    do { \
        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); \
    } while (0)
    
    void _xxfunc(uint32_t x, uint32_t y)
    {
        printf("%"PRId32 " + %"PRId32 " = %"PRId32 "\n", x, y, x + y);
    }
    
    int main(void)
    {
        uint16_t aa = 1000;
        uint16_t bb = 6000;
        xxfunc(aa, bb);
    }
    

    Wandboxで実行

    typeof ~ は gcc の拡張文法なので CC-RL 等では使用できないと思いますが引数のサイズだけであれば同様に可能でしょう。

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

  • In reply to fujita nozomu:

    構造体に入れてしまえば引数型の違いは全てエラーにできますね。

    #include <stdio.h>
    #include <stdint.h>
    #include <inttypes.h>
    
    typedef struct {
        uint16_t content;
    } uint16_s;
    
    typedef struct {
        int16_t content;
    } int16_s;
    
    typedef struct {
        uint32_t content;
    } uint32_s;
    
    typedef struct {
        int32_t content;
    } int32_s;
    
    uint32_s xxfunc(uint32_s x, uint32_s y)
    {
        uint32_s z = {x.content + y.content};
        return z;
    }
    
    int main(void)
    {
        uint16_s aa = {1000};
        int32_s  bb = {6000};
        uint32_s cc = xxfunc(aa, bb);
        printf("%"PRId32 " + %"PRId32 " = %"PRId32 "\n", aa.content, bb.content, cc.content);
    }
    

    Wandboxで実行

    ※ お勧めしません

Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page