【问题标题】:Write function inline (not inline function) C/C++编写函数内联(不是内联函数)C/C++
【发布时间】:2017-01-05 16:51:52
【问题描述】:

我想知道我是否可以编写类似函数内联的东西,或者更像是带有 return 语句的块。这是我的想法的一个例子:

int main(int argc, char* argv[])
{
    printf("result is '%s'\n", 
        {
            char buffer[100];
            //Do some code here to determine string
            return buffer;
        }
    )

    return 0;
}

【问题讨论】:

  • 看起来你想要一个lambda
  • 选择 C ​​或 C++。这些是具有不同解决方案的不同语言。
  • @BaummitAugen 似乎我们已经有了来自 NathanOliver 的 C++ 解决方案。如果有一个用于 C 的,那也很好。
  • @JohnLeuenhagen 这是一个不同的问题,因为 c 不是 c++ 不是 c。
  • 你为什么要这个?为什么不使用内联函数?

标签: c++ c function inline


【解决方案1】:

对此的标准 C 解决方案是编写程序代码,而不是“功能”代码:

int main(int argc, char* argv[])
{
    char buffer[100];
    {
       // some code, note that variables here go out of scope at the next }
    }
    printf("result is '%s'\n", buffer);
    return 0;
}

您可以使用{ /* ... */ } 引入嵌套范围,甚至在函数内部。

请注意,您显示的代码 - 即使有类似 lambdas 之类的东西 - 也会导致未定义的行为,因为您正在返回一个指向不再存在的数组的指针(它已超出范围)。

如果// some code ... 很多,则将其放入单独的函数中,并将其标记为static,这样它就不会从翻译单元中导出。

【讨论】:

    【解决方案2】:

    你正在寻找的是lambda function

    请注意 lambda 函数自 C++11 以来就已引入,因此您应该有一个兼容的编译器(现在几乎所有最新的编译器都支持它们)。 p>

    这只是一个小例子:

    #include <string>
    #include <iostream>
    
    int main(int argc, char* argv[]) {
      // Define a closure - note use 'auto' in order to auto-determine the type.
      auto my_lambda = []() -> std::string {
        return std::string("This is a string");
      };
    
      std::cout << "Result: " << my_lambda() << std::endl;
    
      return 0;
    }
    

    附加说明:这是 C++。 C 没有那种东西。

    【讨论】:

      【解决方案3】:

      GCC 支持嵌套函数作为扩展,但它不是可移植/标准的。

      您也可以使用 lambda。

      【讨论】:

        猜你喜欢
        • 2011-08-23
        • 1970-01-01
        • 1970-01-01
        • 2014-12-24
        • 1970-01-01
        • 1970-01-01
        • 2023-03-10
        • 2011-03-07
        相关资源
        最近更新 更多