-
Notifications
You must be signed in to change notification settings - Fork 163
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
C/C++の予約語と衝突する識別子を定義しているのを何とかしたい #1124
Comments
ふと思ったけど、こういうのも本来ダメなんだよね。
MSVCのテンプレートクラスの記述は、ほぼほぼこんな感じ。 普通に考えたら「前者一択」なんだけど、マイクロソフトだからなぁ・・・。 |
https://ja.cppreference.com/w/cpp/language/identifiers
ということで、標準ヘッダがまさにそういう使い方をするために予約されているので問題ないですね。 |
コンパイラ付属の標準ライブラリ実装側はユーザー側のコード(おそらくグローバル識別子)と衝突しないように予約語のルールに則ったコードを書いて実装する必要があるという事でしょうね。言語仕様で決まっているライブラリを実装するコード側では、使える識別子に関してはユーザー側とは逆の一定のルールに則る必要があるのかもしれません。主にグローバルスコープの識別子にだと思いますが。。ヘッダファイル側の記述に関しては #include でプリプロセッサで取り込まれるのと、リンク時にはシンボル名の衝突が発生しないように気を使う必要があるんでしょうね。 |
テンプレートクラスの書き方は標準ライブラリみて覚えたので、 理屈的に、gccでもそういう書き方がなされていたとしても「真似しちゃダメよ」ってことなんですね。う~む、気を付けよう。 |
モチベーションが尽きたので閉じてしまいます。 #1394 |
問題内容
#1123 (review)
コード全体を Grep してみました。
m/\b_[A-Z]/
を「大文字小文字区別する」でGrep。s/^.*\b(_[A-Z]\w+)([^\r\n]*)/$1\r\n$2/g
で全置換。(何回か繰り返しs/[^0-9A-Za-z_\r\n]+//g
で全置換。s/^\r\n//g
で全置換。Ctrl + A
で全選択してAlt + A
で選択範囲ソート。Alt + M
で重複行排除して「N行をマージしました」をOKで閉じる。検出した予約語の総数は 208 でした。
4分の1くらいは「本物の予約語」なので無視して考えると、違反は 156件 でした。
こういうこと書くと、Microsoftが定義した予約語は本物じゃねーよ とか突っ込む人いそうですが、メンドクサイのでMicrosoftのコンパイラ定数も「C/C++予約語」であるものとして考えます。
C/C++予約語のルールに違反した識別子の (BLACK) リスト
数が多いのと、この辺の定義し直しても具体的な新機能には結びつかないのとで、当面は放置しておくつもりでいます。
githashのバージョン定義定数が引っかかっていて、あのへんの定数は
Appveyor & Azure Pipelines
の両対応のために再定義する話があった気がするので、その時にまた会話する感じになるのかな、と思っています。再現手順
アプリ挙動に影響しない部分なので再現手順はありません。
ソースコードの書きっぷりの不備なのでアプリ機能に影響はありません。
再現頻度
ある意味「常に発生」しています。
実害はないので「発生してない」とも言えます。
問題のカテゴリ
環境情報
ソースコードの問題なので関係ありません。
スクリーンショット
The text was updated successfully, but these errors were encountered: