見出し画像

Retro-gaming and so on

C11/C17がなかなか厄介な件について

WindowsのVisual Studio 2019以降はISO標準C、いわゆるC11やC17にも対応する、って事になって本格的に書くならそっちの方でやろう、と決意したのはイイんだが・・・・・・。
いや、全然Cは専門じゃないし。嫌いだし。Lispの方が全然好きなんだけど。一応教養として押さえておこう、って思ったわけ。

ところがこれが困った。Web検索してもなかなかC11/C17での「書き方」指南ってのが見つからないんだよ。
一応こういうのを見つけてみたりはしたんだけど・・・・・・。

曰く、

新しいコードに、char、int、short、long、unsignedなどの型を使おうとしているなら、それは誤りです。


ふーん。
代わりにこういうのが提言されている。

一般的な標準データ型は以下のとおりです。
  • int8_t、int16_t、int32_t、int64_t – 符号付き整数型
  • uint8_t、uint16_t、uint32_t、uint64_t – 符号なし整数型
  • float – 標準的な32ビットの浮動小数点数型
  • double – 標準的な64ビットの浮動小数点数型
charはもう使わないので注意してください。実際、C言語ではcharは誤った名称で誤った使い方をされています。

なるほど、と思った。
じゃあ、取り敢えず言われたようにやってみようか、と。

ところがだよ。やってみると互いの変換が上手く行かないんだよな。
特にscanfとかprintfとか書式指定子が絡むパターン。例えば構造体設計してこれらのデータ型で読む、とかやっても「思った通りにいかない」と言うのが発覚してる。ここ2日間ばかり色々試してみたんだけど、そもそもそれらの「解決策」が見つからんし、じゃあ、こう書くべきだ、ってのも見つからないのだ。
例えば書式指定子%sがワイド文字なり、char16_tなりchar32_tに対応してるのか。なんかに代入する場合、左辺と右辺の型を完全一致させるにはどうするのか、分からん事が多すぎるのだ。
そもそも、C言語自体が、ぶっちゃけ、入出力関連がヘナチョコなのだ。ヘナチョコなトコで型が増えて、じゃあ今までのようなセオリーで書けるのか、っつーとそりゃムリだろうってなりかねない。
結果色々試して上手く行かなければ、「メンド臭い。ANSI Cに戻るかぁ」ってなりかねないんだよな。
そしてどんなに色々型を増やしても、所詮Cの型自体もヘナチョコなのである。

あとムカつくのが件の境界チェック関数群、AnnexKの問題である。これ、仕様書見る限り色々とラクになるんだよ。絶対な。
ところが、gccやclangはこの実装をしてない。理由はハッキリ言ってやろう、Microsoftが提案したから、だ。それ以外理由なんざねーだろ、っての。
プログラミング言語の制定なり改訂ってのは「より使いやすいようにする」ってのが目的。だから古いANSI Cにこだわってプログラムを書くのは「間違い」なのだ。古い機構がイイのだったら、そもそも改訂なんざ必要ないだろ、って話。
だからMicrosoftの提案は正しいのだ。もし不満があるなら議論を尽くすべきなんだよな。
ところが、Cの場合はどう見ても、大して大多数に影響が無いプラットフォームのベンダーとかが実権握ってるんだよなぁ。かつてはSun Microsystemsとか、か。有名企業だったけど、一般人相手の商売してねぇだろ?一般人相手の商売して苦労してるのは過去はMS-DOS、そして今はWindowsのベンダーなんだよ。大体、結果Sunなんざ買収されてるような企業じゃん。
何かこの辺歪みがあるんだよな。「Cの入出力は安全じゃない」ってずーっと言われてきてて。仮に標準Cにconio.hが導入されてたら問題はもっと小さくなってたんとちゃうんか?
彼らはMicrosoftを畏れてるだけ、だ。そしてMicrosoftを苛めてハブろうとしてる。じゃあ、AppleだったらMicrosoftより「安全」なのか?冗談言ってんじゃねーよ、Appleの方がMicrosoftより100倍は危険な企業だぞ。何せMicrosoftと違って、ハードもソフトも単一企業で支配しようとしてんだ。Googleも既に「危険な」企業だ。殊更Microsoft「だけを」危険視する必要なんざねーだろ。
だからここでは恐らく「議論」なんざ無かったんだろう。工学的判断でも何でもない、単なるクソである、苛めである。

ここら辺含め、一旦、Cの仕様もバックワードコンパティビリティ捨てる段階に来てんじゃねーの?って思い始めた。いや、バックワードコンパティビリティは大事なんだけどさぁ。何か結果色々とアドホックに追加してて整合性大丈夫かよ、って思うようになった。上にも書いた通り、データ型の変換、ないしは入力、出力がメタクソだから、だ。いや、知らんだけかもしれんが。しかし知ろうとしてもネットで見つからないのだ。少なくとも見つかりづらい。
大体、真偽値使うために #include <stdbool.h> って一々ヘッダに書かなきゃならない言語がマトモなのだろうか?これを「書法」として強制するなら、やっぱ人々はreturn 0;とか書くよなぁ。推奨で#include <stdlib.h>してreturn EXITSUCCESS; するよりラクなんだもの。
尖った人がRustとかに行くのは分かる気がする。Cを捨てて低レベルで一環した事を書きたい、ってのは間違った希望じゃないからだ。
まぁ、総括すると、世の中には良く分からん事が多すぎる。

ごめん、なんだかんだ言って単なる愚痴だ。
  • Xでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

最近の「プログラミング」カテゴリーもっと見る

最近の記事
バックナンバー
人気記事