gpt4 book ai didi

c++ - C 和 C++ 中的 sizeof 结构或变量

转载 作者:可可西里 更新时间:2023-11-01 17:05:43 25 4
gpt4 key购买 nike

我不明白为什么这段代码在 C 中打印 1,而在 C++ 中打印其他数字?

#include <stdio.h>
static char T = 'a';
int main(int argc, char** argv) {
struct T { char X[2]; };
printf("size of T is %zu\n", sizeof(T));
}

为什么这段代码在 C 和 C++ 中都打印 1?

#include <stdio.h>
int main(int argc, char** argv) {
static char T = 'a';
struct T { char X[2]; };
printf("size of T is %zu\n", sizeof(T));
}

有人可以稍微解释一下吗?

最佳答案

因为在 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++ 希望您指定您真正想要使用结构而不是 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: In function »int main(int, char**)«:test.cc:5:43: Warning: unknown converting symbol »z« in format [-Wformat]test.cc:5:43: Warning: to many arguments for format [-Wformat-extra-args]test.cc: global:test.cc:3:5: Warning: unused parameter »argc« [-Wunused-parameter]test.cc:3:5: Warning: unused parameter »argv« [-Wunused-parameter]test.cc:2:13: Warning: »T« defined, but not used  [-Wunused-variable]

在这种情况下,您会看到全局 static char T 已被定义,但从未使用过。

关于c++ - C 和 C++ 中的 sizeof 结构或变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12833014/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com