8

私は現在次のことを行っており、コンパイラ(MSVC2008 /および2010)はそれについて文句を言いませんが、それが悪い考えかどうかはわかりません:

#ifndef FOO_H_
#define FOO_H_

// note, FOO_H_ is not a comment:
#endif FOO_H_

いつもは と書いていたの#endif // FOO_H_ですが、今日はそうしないことに気づき、しばらくコメント方式をやっていないらしいのでおかしいと思いました。

すべてのヘッダーに戻って修正する必要があるのはこの悪い習慣ですか (これはクロスプラットフォーム アプリケーションです)、それともそのままにしておいても問題ありませんか?

4

4 に答える 4

6

厳密に言えば (標準の文法によると) #endif、同じ行のディレクティブに続くトークンは許可されません (コメントは、前処理ディレクティブよりも早い翻訳フェーズ (フェーズ 3 対 4) で削除されるため、問題ありません)。

しかし、MSVC はそれを許可しているようです - 私はこれらを修正する探求には行きません (問題を引き起こしていないので) が、それらを含むヘッダーを変更するときに、おそらくそれらを修正するために精神的なメモを作成するでしょう.

もちろん、サポートされている他のコンパイラがそれらに関する診断を発行する場合は、おそらくそれらを修正することがより緊急になります。

于 2010-08-11T18:48:26.307 に答える
5

それは大丈夫ではありません、それは有効ではありません、AFAIK。多くのコンパイラは、#endifただしの後の余分なテキストを無視し、多くの場合、それについて警告します。//コメントにするには、 を追加する必要があります。

于 2010-08-11T18:46:11.153 に答える
4

他のみんなが投稿したもので、私は実際に問題を修正するのを手伝うかもしれないと思いました。(多くのファイルにあると仮定します。)

Visual Studioの検索と置換機能を使用して、問題のあるすべての行を一度に修正できます。"\#endif {[a-zA-Z\.\_]+}$"[検索対象:]と[置換:]を設定するだけ"#endif //\1"です([検索オプション]で[使用:[正規表現]]がオンになっていることを確認してください)。

そして、ソリューション全体でそれを実行すれば、うまくいくはずです。

(最初にプロジェクトをバックアップしてください。私はこれをテストしました。意図したとおりに機能しているようですが、自己責任で使用してください。)

于 2010-08-11T19:00:11.773 に答える
1

コンパイラがそれについて警告する必要がある理由。

ヘッダーファイルは次のようになります。

#ifndef X
#define X
// STUFF
// The next line does not contain an EOL marker (can happen)
#endif

今、あなたはこれをソースから含めます

#include "plop.h"
class X
{
}

コンパイラが技術的にファイルをインクルードする場合、展開されたソースは次のようになります。

#define X
// STUFF
// The next line does not contain an EOL marker (can happen)
#endif class X
{
}

最新のコンパイラのほとんどは、発生する可能性があることを考慮し、含まれるファイルに追加のEOLトークンを貼り付けて、これを防止します(技術的には許可されていませんが、問題が発生する状況は考えられません)。

問題は、一部の古いコンパイラがこの追加のトークンを提供しないことです(より標準に準拠)が、その結果、上記のコードをコンパイルしてしまう可能性があります(その結果、2つのことについて警告する傾向があります1)ソースにEOLがありませんファイルと2)#endifの後のもの

于 2010-08-11T20:44:35.237 に答える