構造体では、だけでなくC
呼び出されるためです。C ++では、のローカル定義はグローバル変数を非表示にします:struct T
T
struct T
T
#include <stdio.h>
static char T = 'a'; // (1)
int main(int argc, char** argv) {
// `struct T` shadows outer `T` in C++
struct T { char X[2]; }; // (2)
// C: sizeof char (1); C++: sizeof struct T (2)
printf("size of T is %u\n", sizeof(T));
// C/C++: sizeof struct T (2)
printf("size of struct T is %u\n", sizeof(struct T));
}
一方、両方の宣言が同じ名前付けコンテキストにある場合、C ++は、 :T
ではなく構造体を実際に使用することを指定することを想定しているため、識別子のあいまいさは同じ結果になります。char T
#include <stdio.h>
int main(int argc, char** argv) {
static char T = 'a';
struct T { char X[2]; };
printf("size of T is %u\n", sizeof(T)); // sizeof (char)
printf("size of struct T is %u\n", sizeof(struct T));// sizeof struct T
}
これにより、CとC++の両方で同じサイズになります。
この間違いを避ける方法
通常、コンパイラは識別子があいまいであることを知っていますが、警告は隠されていることがよくあります。コンパイラフラグを使用して警告を表示します。GCCでは、-Wall -Wextra
通常のプログラミングに最も役立ちます。
test.cc:関数内»int main(int、char **)«:
test.cc:5:43:警告:形式[-Wformat]の不明な変換記号»z«
test.cc:5:43:警告:フォーマット[-Wformat-extra-args]の多くの引数に対して
test.cc:グローバル:
test.cc:3:5:警告:未使用のパラメーター»argc«[-Wunused-parameter]
test.cc:3:5:警告:未使用のパラメーター»argv«[-Wunused-parameter]
test.cc:2:13:警告:»T«は定義されていますが、使用されていません[-Wunused-variable]
この場合、グローバルstatic char T
が定義されているが、使用されていないことがわかります。