1

C++ では、識別子の二重アンダースコアがコンパイラ用に予約されていることを理解しています。対応するヘッダー ファイルに次のような特性を持つ C コードがあります。

extern "C" {
    #define HELLO__THERE 1
    int hello__out__there( int );
}

私は C++ プロジェクトでこのヘッダーを使用し、次のようなことを C++ で行う予定です。

if (HELLO__THERE == abc) 
    hello__out__there(foo);

これは C++ で許容される動作で、標準でカバーされていますか?

4

4 に答える 4

12

C++03 標準17.4.3.1.2 Global namesでは、アンダースコアの使用は予約済みとして定義されています。

2 つのアンダースコア (_ _) を含む名前、またはアンダースコアで始まり、その後に大文字が続く名前 (2.11) は、実装で使用するために予約されています。

予約されているということは、準拠する実装で使用される可能性があることを意味するため、使用することはお勧めできません。

于 2011-07-20T02:18:15.087 に答える
2

たまたま定義の 1 つがコンパイラの定義と衝突しない限り、問題はありません。その場合、(コンパイラの構成に応じて) シンボルが重複しているという警告またはエラーが発生する可能性があります。

それが役に立てば幸い。乾杯!

于 2011-07-20T02:00:29.423 に答える
0

The method call would be OK but why compare HELLO_THERE to some value abc? If you were testing to see if a method was there I would wrap it in #ifdef ... #endif instead because if hello_out_there is not defined for some reason that would be a compile error.

于 2011-07-20T01:38:55.610 に答える
-11

識別子の二重下線はコンパイラ用に予約されています

まず、アンダースコアだと思います。2 番目のそのような識別子は予約されています。それはそれを使用しないことを妨げません。使用できます (名前の競合がなくなるまで)。

これは C++ で許容される動作で、標準でカバーされていますか?

はい。許容範囲です。ただし、許容できるコードと適切なコードには違いがあります。適切なコーディング ガイドラインに従っている場合、コードは良好であり、受け入れられるものになります。IMHO、インターネット上のいくつかの優れたコーディング標準を参照する必要があります。それはあなたを大いに助けます。

于 2011-07-20T02:00:08.480 に答える