gpt4 book ai didi

c++ - C++(或 C)中关于指针的函数作用域

转载 作者:行者123 更新时间:2023-11-30 02:41:18 25 4
gpt4 key购买 nike

我正在尝试编写可移植代码,允许函数访问数组之类的变量,即使它只是一个值。它背后的想法是代码不会生成大小为 1 的数组,但如果它是一个数组,我需要能够遍历数组中的所有值。由于我不能使用 sizeof(foo) 来确定内存是否大于单个实例 sizeof(foo)/sizeof(int) 可能有效,但它是太麻烦了,无法包含在主代码中。宏不会有帮助,因为如果我像我期望的那样使用三元运算符 #define ARRAY_OR_NOT(foo, type) (sizeof(foo)/sizeof(type) > 1) ? (foo) : (&foo) 返回一个指针,以便通过索引访问。这个问题是编译器不喜欢指针和非指针之间的类型混合。

所以我的第二次尝试是函数重载。

int * convert(int value)
{return &value;}
int * convert(int * value)
{return value;}

我知道这行不通,因为第一个函数会返回该函数范围内的临时变量拷贝的地址。所以我的第三次尝试是

int * convert(int * value)
{return value;}
int * convert(int ** value)
{return *value;}

每次调用 convert 时,传递值的地址:convert(&foo)。这应该有效,并且(我认为)它避免返回临时函数范围地址。 convert 的结果可以通过索引访问。在受控的 for 循环中,代码会顺利运行。该程序会知道有多少元素是有值(value)的,但在 for 循环中运行所有内容会比不运行更快。

那么为什么我的第二个代码块会产生“Warning returning temporary scope blahblahblah”警告?

更新:主要的 XY 问题在这里。

基本上,我试图将我的所有代码包装在一个循环中,并访问一个变量中的每个值,每个循环迭代一个值。系统会知道该变量中有多少个值,但代码库太大,将所有内容包装在 if/else 中会很慢。因此,在带有索引的 for 循环中访问某些值的方法是 int foo = convert(&maybeArray)[counter]; 然后我会在 for 循环中多次使用 foo。出于某种原因,Visual Studio 在处理第二个代码块时抛出错误。将此添加到 OP。

另一种解决方案是使用重载运算符制作 2 个函数,这些函数基本上会执行整个代码,而不转换每个变量,但代码库非常大,这需要尽可能可移植。我相信引用 convert 会更有前途。

最佳答案

您已将其标记为 C++,因此我假设您使用的是 C++ 编译器。

您的问题包含很多内容,所以我将进行简化。您需要一个 C++ 函数 convert(x) 它将:

  1. if x is an array, return the address of the first element
  2. if x is not an array, return &x.

(通常,您可能需要重新设计整个东西,convert 似乎是一个非常奇怪的功能)。

template<typename T, size_t N>
auto convert( T (&t) [N] ) -> T* {
return t; // just let pointer decay work for us here
}
template<typename T>
auto convert( T &t) -> T* {
return &t;
}

而且,在 C++ 中,我永远不会将 sizeof 用于 我认为 是数组的东西。这种模板技术是计算数组中元素数量的一种更安全的方法。

此外,您是否希望拥有指针数组,并希望将单个指针视为指针的单元素数组?如果是这样,请谨慎行事。一些看起来像数组的东西,实际上可能是一个指针,例如参数列表中的数组 foo(int is_really_a_pointer[5]) { ...}。有关更多信息,请参阅@MSalters 的评论。使用他的断言来捕捉任何惊喜可能会很好。如果您只是使用 int,那么请不要在我的模板中使用 typename T,为了清晰起见,只需将其强制为 int

最后,也许您不应该将数组转换为指针,而应该请求一个将非数组转换为对单元素数组的引用的函数?

更新 这是一个more complete example展示如何使用 convertconvert_end 找到数组的开头和结尾以迭代数组中的所有元素;当然,其中非数组被视为一个元素的数组。

关于c++ - C++(或 C)中关于指针的函数作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28239038/

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