オプション沼(24) gcc、multichar定数、noなのnoじゃないの?

Joseph Halfmoon

gccのオプション、「no-ナンチャラ」で指定なし、noなしの「ナンチャラ」で指定あり、という両方があるものが多数ありますな。今回のWno-multichar(あるいはWmultichar)もそのようなオプションの一つです。だいたいmulticharacter constantなんて使ったことねーずら。何それ。

※『オプション沼』投稿順indexはこちら

※今回は動作確認に以下を使用しています

    • Windows11 WSL2上のUbuntu 20.04 LTS、gccのバージョンは9.4.0
multicharacter constant

以下の公式ドキュメントの -Wno-multichar の項目を見てみます。

3.8 Options to Request or Suppress Warnings

そこで「例」として挙げられているのは、

‘FOOF’

などという記述です。「普通」こういう記述はユーザコードのタイポなんだと説明があります。文字列ならダブルクオートだしね。しかしま、文法的には以下のような記述はアリだそうです。

 int multVal = 'FOOF';

よゐこは普通こういう記述はせんよな~。でもアリだと。

今回テスト用に作成したコードが以下に。

/* option -Wmultichar, -Wno-multichar */
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char const *argv[])
{
    int multValA = '阿';
    printf("multValA : %x\n", multValA);
    int multValB = 'abcd';
    printf("multValB : %x\n", multValB);
    return 0;
}

ソースコードはUTF-8で書いてます。

-Wno-multicharオプション

3通りの方法でコンパイルしてみたものが以下に。multicharWarning

上記によると、手元のgcc 9.4.0の場合、何も警告オプションつけなくともWmulticharは設定されている扱いで、multichar定数は警告あり。警告を発してもらうとうるさいときには明示的に-Wno-multicharすれば抑止。勿論、Wmulticharすれば警告は出力されるっと。

ただね、古いバージョンのドキュメント読んでいると デフォルトは no だったんじゃないかという疑いもあり。まあどうでもよいちゃ良いのだけれども。

実行結果

よゐこはやらない int 型に multichar定数を代入した結果が以下に。16進出力デス。multiCharResult

‘abcd’はそのまま0x61626364。「阿」も以下のようにUTF-8では、0xe998bfです。Acode

ある意味便利かも。許されているけれども積極的に使うのはなんだかな~な件。

オプション沼(23) gcc、dangling-pointerの見つけ方、伝統的な方? へ戻る

オプション沼(25) gcc、Wmultistatement-macros、うかつな奴? へ進む