因为在C
结构中被调用struct T
而不仅仅是T
. 在 C++ 中, 的局部定义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));
}
另一方面,当两个声明在相同的命名上下文中时,标识符的歧义T
将导致相同的结果,因为 C++ 期望您指定您确实要使用 struct 而不是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:警告:未知转换符号 »z« 格式为 [-Wformat]
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
已定义,但从未使用过。