首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我是否可以调用这样一个子例程来返回一个值,就好像它返回了‘`void`’一样?

我是否可以调用这样一个子例程来返回一个值,就好像它返回了‘`void`’一样?
EN

Stack Overflow用户
提问于 2017-08-22 17:16:46
回答 3查看 71关注 0票数 2

来自编程语言语用学,斯科特:

如果程序员希望调用一个确实返回值的子例程,但在这种情况下不需要该值(重要的是副作用),则可以将C中的返回值“抛出”为无效: foo_index = insert_in_symbol_table(foo);(void) insert_in_symbol_table(bar);

我是否可以调用这样一个子例程,它返回一个值,就好像它返回了void一样?

代码语言:javascript
复制
insert_in_symbol_table(bar);  

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

谢谢。

EN

回答 3

Stack Overflow用户

发布于 2017-08-22 17:22:46

你没必要让石膏作废。例如,printf函数返回一个值(编写了多少个字符),但是很少有人捕获返回值或将其转换为无效。

空位转换通常是一个好主意,如果你用一种不同寻常或违反直觉的方式专门调用一个函数,并且你想向阅读代码的其他人明确表示,是的,你知道你忽略了返回值,是的,这是有意的。

票数 3
EN

Stack Overflow用户

发布于 2017-08-22 17:23:12

你没有违反任何规则。您希望显式执行该转换的原因是让编译器或静态代码分析器知道您有意忽略返回值,否则它们可能会抱怨被丢弃的返回值。代码分析器或编译器之所以会警告您这一点,是因为通常当一个函数返回某项内容时,它被认为是应该检查/处理的信息。

票数 1
EN

Stack Overflow用户

发布于 2017-08-22 17:29:30

我不认为void铸造非常有用。据我所知,它和注释一样好,它不会压制来自__attribute__((__warn_unused_result__))函数( gcc/clang扩展)的警告。

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

代码语言:javascript
复制
/*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
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45823525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档