2016-04-11 7 views
17

私は次のように、列挙型の定義でキーワードを使用する方法があるかどうかを見つけることができなかった:私は識別子としてそれをコンパイラの外観を作るために、@の文字を使用することができますC#では列挙型でキーワードを識別子として使用する方法はありますか?

enum class EServerAction 
{ 
    create, 
    read, 
    update, 
    delete 
}; 

。 C++(Visual Studio 2015)でこれを行う方法はありますか?

+2

コーディング標準で許可されている場合は、各列挙値の最初の文字を大文字にすることができます。 – Sean

+2

削除する名前を変更して削除する – MagunRa

+1

文字の追加が '@'のように許可されている場合、MSVCでは '_'または' $ 'を使用できます。 '$ delete'は有効な識別子です。それ以外の場合は、大文字を使用してください。 –

答えて

14

いいえ使用できません。

MSDNからキーワードは特別な意味を持つ 予約識別子を事前に定義されています。 プログラム内の識別子としてを使用することはできません。

識別子のruleは言う:

識別子は、名前のオブジェクト、参照、関数、 列挙子、種類、クラスメンバー、名前空間、テンプレート、テンプレート 特化、パラメータパックに使用することができ、後藤ラベル、および他のエンティティ、以下の例外を除いて :キーワードのことが可能です

  • 識別子他の目的には使用しないでください。
  • 二重アンダースコアの識別子は予約されています。
  • アンダースコアで始まり大文字で始まる識別子は予約されています。
  • アンダースコアで始まる識別子は、グローバル名前空間に予約されています。
+1

MSDNとlearncppに比べ、[cppreference](http://en.cppreference.com/w/)はIMHOよりも優れています。 – edmz

+0

@black: - cpp参照を追加しました。答えはまだ同じです:)それを指摘していただきありがとうございます。 –

+0

ありがとうございました!私は疑っているが、C#のようなものを持つことは非常に便利だろう。 –

2

C++のキーワードは、C#で使用できるように識別子として使用することはできません。

+0

@blackええ、あなたが '@'でそれを先行している場合のみ。 'int @class = 1;'。その理由は、他の.NET言語では同じ予約語セットがない可能性があるため、その言語のライブラリでC#からアクセスできない名前を持つメソッドや変数を定義できるため、ライブラリを使用できなくなる可能性があります。 (これは.NETの原則の1つで、.NET上で実行されるすべての言語は互換性がなければなりません) – Kroltan

+1

@Kroltan - C++とは異なり、C#enum識別子は完全修飾でなければなりません。ですから、 'enum MyEnum {thing、@class}'があれば、その参照は 'MyEnum.thing'または' MyEnum。@ class'でなければなりません。 C++では、「enum MyEnum {thing、clazz}」があれば、自分で 'thing'や' clazz'を使うことができます。 –

0

この使用してマクロを行うことが可能です:

#define delete _delete 

enum class EServerAction 
{ 
    create, 
    read, 
    update, 
    delete 
}; 

今あなたは、ファイルの他の部分でdeleteを使用することはできませんので、この方法は、通常は推奨されません。しかし、C++コンパイラを使用してC++キーワード(例えばdeleteなど)という名前の識別子を持つCプログラムをコンパイルする場合など、いくつかの状況で便利です。

これは、シンボルの識別子がソースコード内の識別子と異なるため、デバッガで混乱を招くこともあります。 1として

+2

あなたは、そのTUに標準ヘッダーを含めるとUBです。 – edmz

+0

@black IIRCキーワードを '#define 'するのはUB期間です。 – nwp

+1

@nwp Nope; [this](https://stackoverflow.com/questions/2726204/c-preprocessor-define-ing-a-keyword-is-it-standards-conforming)を参照してください。 – edmz

2

2.12 [lex.key] C++ 14規格では、特定の識別子を識別子として使用してはならない。

表4に示す識別子がキーワードとして使用する(ために予約されていますつまり、属性トークン(7.6.1)を除いて、フェーズ7でキーワードとして無条件に扱われます。[注:exportキーワードは未使用ですが、将来の使用のために予約されています。 - エンドノート]:

表4 - キーワード

alignas continue friend register true 
    alignof decltype goto reinterpret_cast try 
    asm default if return typedef 
    auto delete inline short typeid 
    bool do int signed typename 
    break double long sizeof union 
    case dynamic_cast mutable static unsigned 
    catch else namespace static_assert using 
    char enum new static_cast virtual 
    char16_t explicit noexcept struct void 
    char32_t export nullptr switch volatile 
    class extern operator template wchar_t 
    const false private this while 
    constexpr float protected thread_local 
    const_cast for public throw 

さらに、いくつかの識別子を使用してはならない。

また、に示す代替表現特定のオペレータおよび句読点(2.6)の表5は予約されており、それ以外の場合は使用しないでください。

表5 - 代替表現

and and_eq bitand bitor compl not 
not_eq or or_eq xor xor_eq 

があっても、さらに、2.11識別子[lex.name]通り、いくつかはを使用することは違法であるが、コンパイラがに必要とされません

いくつかの識別子は、C++実装と標準ライブラリで使用するために予約されています(1 7.6.4.3.2)、それ以外の場合は使用しない。診断が不要

- 二重アンダースコア_ _またはアンダースコアで始まり大文字(2.12)で始まる各名前は、いずれの用途にも実装されています。

- アンダースコアで始まる各名前は、グローバル名前空間の名前として使用するための実装に予約されています。

関連する問題