【问题标题】:Using pure/const attributes with return-arguments in C with GCC?在 GCC 中使用带有返回参数的纯/常量属性?
【发布时间】:2014-06-01 04:34:40
【问题描述】:

是否可以将函数声明为pureconst(使用GCC 属性),

返回参数 ? (其中参数用于返回值)。

例如:

void mid_v3_v3v3(float r_out[3], v0[3], v1[3])
{
    r_out[0] = (v0[0] + v1[0]) * 0.5f;
    r_out[1] = (v0[1] + v1[1]) * 0.5f;
    r_out[2] = (v0[2] + v1[2]) * 0.5f;
}

除了r_out,这个函数是const,有没有办法将参数标记为返回值,否则将函数视为const

见: https://gcc.gnu.org/onlinedocs/gcc-4.9.0/gcc/Function-Attributes.html

【问题讨论】:

    标签: c gcc constants


    【解决方案1】:

    您自己的链接部分回答了这个问题。关于常量:

    许多函数除了参数之外不检查任何值,并且除了返回值之外没有任何效果。基本上这只是比下面的纯属性稍微严格的类,因为函数不允许读取全局内存。

    请注意,具有指针参数并检查指向的数据的函数不得声明为 const。 同样,调用非 const 函数的函数通常不得为 const。 const 函数返回 void 是没有意义的。

    pure 的文档实际上是错误并且自相矛盾;它说该函数只能访问其参数和/或全局变量,但随后以strlen(访问其参数所指向的成员)为例。

    无论如何,对于您的“返回参数”用法,我认为这两种方法都不可行。但是,您可以做的是使用返回包含结果数组的结构的函数;那么应该应用 pure 属性(假设示例而不是文本,因为 pure 是正确的)。

    【讨论】:

    • 文档可能会更清晰,但我认为这并不矛盾。它并不是说它只能访问参数和全局变量,而是说“它们的返回值仅取决于参数和/或全局变量”,与“那些取决于易失性内存或其他系统资源的可能会改变两次连续通话之间”。结合无副作用规则,这意味着在给定相同参数的情况下,函数的返回值是相同的,除非您在调用之间进行更改。
    • strlen 依赖于参数或全局变量以外的东西;它取决于参数指向的对象。这种区别非常重要,以至于上面引用的const 上的文字强调了这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-03
    • 1970-01-01
    相关资源
    最近更新 更多