来自编程语言语用学,斯科特:
如果程序员希望调用一个确实返回值的子例程,但在这种情况下不需要该值(重要的是副作用),则可以将C中的返回值“抛出”为无效: foo_index = insert_in_symbol_table(foo);(void) insert_in_symbol_table(bar);
我是否可以调用这样一个子例程,它返回一个值,就好像它返回了void一样?
insert_in_symbol_table(bar); 我违反了哪些语法或语义规则?
谢谢。
发布于 2017-08-22 17:22:46
你没必要让石膏作废。例如,printf函数返回一个值(编写了多少个字符),但是很少有人捕获返回值或将其转换为无效。
空位转换通常是一个好主意,如果你用一种不同寻常或违反直觉的方式专门调用一个函数,并且你想向阅读代码的其他人明确表示,是的,你知道你忽略了返回值,是的,这是有意的。
发布于 2017-08-22 17:23:12
你没有违反任何规则。您希望显式执行该转换的原因是让编译器或静态代码分析器知道您有意忽略返回值,否则它们可能会抱怨被丢弃的返回值。代码分析器或编译器之所以会警告您这一点,是因为通常当一个函数返回某项内容时,它被认为是应该检查/处理的信息。
发布于 2017-08-22 17:29:30
我不认为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
}https://stackoverflow.com/questions/45823525
复制相似问题