gpt4 book ai didi

查找数组大小的 C++ 模板/宏 "function"

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:42:47 26 4
gpt4 key购买 nike

这是一个奇怪的情况。

我找到了这段代码。我在我的源代码中将其追溯到 2011 年 3 月的一次提交。我在它旁边没有评论,但我相当确定它是对我在这个问答网站上看到的内容的改编。

namespace detail {
template <typename T, size_t N>
char (&SIZEOF_ARRAY_REQUIRES_ARRAY(T (&)[N]))[N];
}
#define SIZEOF(x) sizeof(detail::SIZEOF_ARRAY_REQUIRES_ARRAY_ARGUMENT(x))

使用方法如下:

int buffer[] = {1, 2, 3, 4, 5};
printf("Size of buffer: %u\n", SIZEOF(buffer)); // prints 5 instead of 8 (or 4)

我无法在常规项目上使用此模板/宏/无论它是什么。所以我不能只是漫不经心地用它替换我所有的 sizeof() 。我必须小心,只在我懒惰并且想要获取我刚刚在堆栈上分配的缓冲区的大小的情况下才使用它。从字面上看,这是唯一有用的地方,实际上也是我用过的唯一地方,而且我只用过一次。

即使现在也不清楚,或者我应该说,尤其是现在,为什么这样做有效。这才是这个问题的真正目的。为什么这东西会起作用?它是如何工作的?这是什么的模板?它是一个函数吗? 这是什么魔法??

我现在打算删除这段代码,主要是因为它从根本上说是无用的,但在我这样做之前,我必须弄清楚它为什么会这样做。

最佳答案

好吧,我大概找到了答案。但不是在@WhozCraig 先生之前。无论如何:

这里的声明是一个函数声明。不存在函数实现。这样做的原因是 sizeof 是一个特殊的小雪花,它只知道类型就满足了,当然函数声明给了 sizeof 它需要的东西。

至于我们实际声明的函数是什么,这变得越来越模糊,但据推测它的返回类型是对 char [N] 的引用,很抱歉,我不知道是什么 T (&)[N] 的意思是,我认为这是对 T [N] 的引用...这显然是该函数的参数类型。好吧,重要的是 sizeof 最终以某种方式得到一个 char[N] 或对这种类型的引用,这足以让它推断出你给的缓冲区的实际字节大小原始宏参数。

再看看这个,奇怪的语法(我只能假设是表明这些是引用类型)是为了阻止指针类型通过这里并破坏我们所有字节计数乐趣的可能性。

还有一个问题...我认为这真的会导致我的 SIZEOF(buffer) 生成 5,这实际上是错误的。是的,5 是该缓冲区的大小,但是在缓冲区上调用的sizeof 实际上是它占用的实际字节数。因此这必须是 20!

更新:我刚刚在 Xcode 中测试了这个。是的。 可耻!

int buffer[5];
std::cout << "omg" << SIZEOF(buffer) << std::endl;

输出:

omg5

太好了,现在我必须让它正常工作......哦,那还不错。

 namespace detail {
template <typename T, size_t N>
- char (&SIZEOF_ARRAY_REQUIRES_ARRAY_ARG(T (&)[N]))[N];
+ char (&SIZEOF_ARRAY_REQUIRES_ARRAY_ARG(T (&)[N]))[N * sizeof(T)];
}
#define SIZEOF(x) sizeof(detail::SIZEOF_ARRAY_REQUIRES_ARRAY_ARG(x))

现在输出:

omg20

关于查找数组大小的 C++ 模板/宏 "function",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26050775/

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