【问题标题】:Can I just call such a subroutine which returns a value as if it returned `void`? [duplicate]我可以调用这样一个返回值的子程序,就好像它返回了`void`? [复制]
【发布时间】:2018-01-31 02:06:25
【问题描述】:

来自 Scott 的 Programming Language Pragmatics:

如果程序员希望调用一个返回的子程序 值,但在这种特殊情况下不需要该值(所有 重要的是副作用[s]),那么 C 中的返回值可以是 通过将其“铸造”为无效而丢弃:

foo_index = insert_in_symbol_table(foo);
...
(void) insert_in_symbol_table(bar);

我可以调用这样一个返回值的子程序,就好像它返回了void

insert_in_symbol_table(bar);  

我违反了哪些语法或语义规则?

谢谢。

【问题讨论】:

  • 如果被告知编译器会抱怨。
  • @IgnacioVazquez-Abrams 我如何告诉 gcc/clang/tcc 这样做?
  • @PSkocik: -Wunused-result
  • @IgnacioVazquez-Abrams 那不行。 -Wunused-result 应该默认打开,它只对显式标记为__attribute__((__warn_unused_result__)) 的函数发出警告。还是谢谢。
  • @PSkocik:GCC 手册页说 -Wno-unused-result 是默认值。

标签: c


【解决方案1】:

您不需要将强制类型转换为 void。例如,printf 函数返回一个值(写入了多少个字符),但很少有人看到返回值或将其强制转换为 void .

如果您以不寻常或违反直觉的方式专门针对副作用调用函数,并且您想明确地向阅读代码的其他人发出信号,那么 void 强制转换通常是一个好主意,是的,您知道自己在忽略返回值,是的,这是故意的。

【讨论】:

    【解决方案2】:

    您没有违反任何规则。您想要显式执行该强制转换的原因是让编译器或静态代码分析器知道您故意忽略返回值,否则他们可能会抱怨丢弃的返回值。代码分析器或编译器可能会对此发出警告的原因是,通常当函数返回某些内容时,它会被视为应检查/处理的信息。

    【讨论】:

      【解决方案3】:

      我不觉得void 转换很有用。 据我了解,它和评论一样好,它不会沉默 来自__attribute__((__warn_unused_result__)) 函数的警告(gcc/clang 扩展)。

      我一直在使用一个显式的忽略宏来使这些静音(或者简单地说我忽略了返回值)。

      /*Ignore macro ( NS == your libs namespace) */
      #define NS_ign(Expr)  do{__attribute__((__unused__)) __typeof(Expr) NS_ign = Expr; }while(0)
      
      /*example usage*/
      #include <stdio.h>
      __attribute__((__warn_unused_result__))
      int Puts(char const *X) { return puts(X); }
      
      int main()
      {
          //puts returns an int -- no harm done if you silently ignore it
          puts("hello world"); 
          /*(void)Puts("hello world");*/  //(void) cast doesn't silence WUR
          NS_ign(Puts("hello world"));    //this does
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-28
        • 2019-06-26
        • 1970-01-01
        • 2015-04-08
        相关资源
        最近更新 更多