0

#define を使用して C++ キーワードを再定義することは可能ですか?

#ifdef int
#undef int 
#define int 2
#endif
int main(){
    //Do something with int
}

この場合、出力は表示されませんが、内部で何が起こっているのかを理解したいと考えています。私が #define を持っていない理由は、標準のヘッダー ファイルを使用しない場合、予約済みのキーワードを #define できることがわかったからです。また、次のコードを実行しようとしました。

#include<iostream>
using namespace std;
#ifdef int
#undef int 
#endif
int main(){
    cout<<int;
}

しかし、上記の te は cout 行でエラーをスローします。

4

4 に答える 4

2

出来ますか?はい。スタイルいいですか?絶対違う。

プリプロセッサは C/C++ キーワードを認識せず、プリプロセッサ トークンのみを認識し、厳密なテキスト置換のみを行います。

あなたの例は、それを行っているため、エラーになります#undef。定義を解除すると、以前の動作に戻ります。

このようなことを行うために私が知っている唯一の有効な使用法は、古いコンパイラのバグを回避することであり、そのコンパイラは最近では関係ありません。

于 2012-08-23T22:26:52.070 に答える
1

技術的には機能しますが、おそらくあまり効果がありません。標準 C++ ライブラリを使用する場合は、17.6.4.3.1 [macro.names] パラグラフ 2 に従って、キーワードまたはその他の名前のセットを定義することはできません。

翻訳単位は、キーワード、表 3 にリストされている識別子、または 7.6 で説明されている属性トークンと字句的に同一の #define または #undef 名を使用してはなりません。

于 2012-08-23T22:33:03.813 に答える
0

できますが、すべきではありません。

あなたの例でintは、 でラップされているため、再定義されません#ifdef int。つまり、「これは、プリプロセッサ マクロという名前のマクロが既に存在する場合にのみ実行し、存在しない場合にのみ実行する」ことを意味しintます。

と書いた場合#define int 2、すべての出現箇所は;intに置き換えられます。しかし、ナンセンス2なので、コードはコンパイルされません。2 main() {cout<<2;}

#undef言語からキーワードを削除しません。を使用して以前に定義されたプリプロセッサ マクロのみを削除します#define

于 2012-08-23T22:28:27.683 に答える