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オプション
上記によると、手元のgcc 9.4.0の場合、何も警告オプションつけなくともWmulticharは設定されている扱いで、multichar定数は警告あり。警告を発してもらうとうるさいときには明示的に-Wno-multicharすれば抑止。勿論、Wmulticharすれば警告は出力されるっと。
ただね、古いバージョンのドキュメント読んでいると デフォルトは no だったんじゃないかという疑いもあり。まあどうでもよいちゃ良いのだけれども。
実行結果
よゐこはやらない int 型に multichar定数を代入した結果が以下に。16進出力デス。
‘abcd’はそのまま0x61626364。「阿」も以下のようにUTF-8では、0xe998bfです。
ある意味便利かも。許されているけれども積極的に使うのはなんだかな~な件。