C/C++の再定義
ヘッダーファイルに次の2行の同じコードを書きなさい。
typedef int X;
typedef int X;
gccコンパイルではtypedef 'X'の再定義がすぐに報告されますが、g++では実際には何も起こりません、不思議でしょう?そこで、ドキュメントを見てみると、C++ではこんな記述がありました: " In a given non-class scope, a typedef specifier can be used to redefine the name of any type declared in that scope to In a given non-class scope, a typedef specifier can be used to redefine the name of any type declared in that scope to refer to the type that already refers. " さて、C++はクラス以外の場合にも寛容で、次のようにエラーが出るようですね。
class A{ <未定義
typedef int Y;
typedef int Y;
};
残念ながら、C 規格を見回った結果、再定義に関する明確な記述はなく、他のすべての C コンパイラがエラーを報告するかどうかはわかりません。
そこでマクロを思いつき、以下の3つのケースを試してみました。
ケース1.#define M 1
#define M 1
ケース2 #define M(x) x++
#define M(x) x++
ケース3 #define M(x) (x+1)
#define M(x) (x + 1)
gcc/g++のコンパイル結果(ここでは実際にはプリプロセッサcc1/cc1plusと言うべき)も同じで、Case1/2はOK、Case3はエラーが報告されます。規格を確認すると、このように記述されています。
<スパン (1) 2つの置換リストは、両者の前処理トークンが同じ数、順序、スペル、空白の区切りを持つ場合にのみ同一であり、空白の区切りはすべて同一とみなされます。
(2) オブジェクトライクマクロとして定義されている識別子は、2番目の定義がオブジェクトライクマクロの定義であり、かつ2つの置換リストが同一でない限り、他の#define前処理指令によって再定義されてはならない。 同様に、現在関数型マクロとして定義されている識別子を他の#define前処理指令によって再定義してもならないが、その2番目の定義は、オブジェクトライクマクロの定義である必要がある。ただし、2 つ目の定義が関数ライクマクロの定義で、パラメータの数とスペルが同じであり、2 つの置換リストが同じである場合は、この限りでありません。
を同一とする。
ここで重要なのは、2つのテキスト(空白を含めて同一)がある場合のみ
http://hi.baidu.com/zhuxiaoyin/blog/item/f603f58e2e1321e2f11f3656.html
関連
-
解決済み] g++ コンパイルエラー: ')'トークンの前に一次式があることが予想される
-
構造体の配列--[エラー] '['トークンの前に一次式があることが予想される
-
error: '.' トークンの前にunqualified-idを指定する必要があります。
-
[C] レポートエラー 代入の左オペランドとしてlvalueが必要
-
Cエラー [エラー] 代入_Ashesの左オペランドにlvalueが必要です-プログラマーズ・シークレット
-
libc++abi.dylib: NSException タイプの捕捉されない例外で終了するエラー
-
VSCodeでCプログラムを書くとエラーになる:ソースファイル "stdio.h" を開くことができない
-
error: 'for' loop initial declaration is only allowed in C99 mode 原因と解決方法
-
未定義の `__isoc99_sscanf' への参照
-
C: 1を求める! + 2! + 3! + ... + n! (ループ)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
g++が内部・外部コマンドソリューションとして認識されない、MinGWを初めて使うときの落とし穴
-
赤線の位置は必ずしも間違っていない:式は変更可能なlvalueでなければならないエラーは、この文とは別の場所に存在する可能性があります。
-
#137: 式は変更可能なlvalueでなければならない問題 // 文字列配列の代入問題
-
[C] Error [Error] 代入の左オペランドとして lvalue が必要です。
-
C++の配列コピー
-
ポインタ定数および定数ポインタ
-
関数 'malloc' の暗黙の宣言に対する解決策
-
initializer element is not constant "というエラーが表示されるのですが?
-
C 言語のポインタ配列のポインタ型、ポインタに値を割り当てるために配列名を使用、コンパイル時の警告:互換性のないポインタ型からの初期化
-
C - 添え字の値が配列でもポインタでもベクトルでもないエラー