【问题标题】:static const void *method() in CC 中的静态 const void *method()
【发布时间】:2012-07-05 01:02:01
【问题描述】:

我在我正在修改的程序上看到了这个:

static const void *method()
{
 // other code
 return anotherMethod(param1,param2);
}

据我所知,这将返回一个指向函数的指针。现在基于this,我试图弄清楚static const void 的应用:

int f(void);
int *fip(); //Function returning int pointer
int (*pfi)(); //Pointer to function returning int

那么添加static const真正优势是什么(假设这应用于指定函数的返回值)。另外,是否会调用指向函数的返回指针?或者它只是一个指向它的指针?因为从代码中我有以下内容:

void start()
{
  method();
}

我假设它会被调用,否则它会被分配给一个指针。

【问题讨论】:

  • 只是一个旁注:我相信你混淆了 C 和 C++。在 C++ 中,start() 表示start(void),前者是鼓励风格。但在 C 语言中,start() 的意思是“函数接受各种垃圾参数,希望出现细微的错误”。在 C 语言中,你应该总是写 start(void)。没有参数的函数在 C 标准中被标记为过时的功能,并且将来可能会从语言中删除(请参阅 C11 6.11.6)。
  • 我实际上是在objective-c上下文中使用的,方法的名称是完全任意的。但感谢旁注..

标签: objective-c c function-pointers void-pointers


【解决方案1】:

不,该函数将返回 const void*,而 static 将函数的可见性限制在文件范围内。

【讨论】:

  • 好的,如果我不关心返回,是否有充分的理由实际返回const void*?这是一个好习惯吗?
  • 它通知调用者返回的值不会被修改,所以是的,它很有用。然而,constness 可以被丢弃,但至少意图是明确的,调用者必须有意丢弃它,而不是意外修改它。
【解决方案2】:

函数前的静态关键字并不意味着它会返回一个静态变量。它只是意味着该功能是“静态的”。这意味着无法从“外部”对象(如从另一个源文件编译的目标文件)访问此函数。

你给出的例子,会返回

const void*

并且将拒绝链接到该函数的任何外部引用。

【讨论】:

    【解决方案3】:
    static const void *method()
    

    它返回一个“const void*”。这可能是一个转换为 void* 的函数指针,但通常情况并非如此。

    void start()
    {
      method();
    }
    

    在这里,调用者根本对结果不感兴趣。没有什么神奇的事情发生。

    【讨论】:

      【解决方案4】:

      static 表示该函数是编译单元(源文件)私有的,在它之外不可见。

      const void * 表示返回值是指向常量内存的指针,即不应该写入的内存。

      【讨论】:

        猜你喜欢
        • 2020-08-01
        • 2015-06-07
        • 2020-09-26
        • 2010-12-21
        • 1970-01-01
        • 1970-01-01
        • 2017-05-02
        • 2022-11-10
        • 1970-01-01
        相关资源
        最近更新 更多