我尝试调用自编函数而不处理其返回值。 gcc在函数调用行告诉我,这将是语句,没有效果。 为了检查我的函数是否被调用,我添加了一些printf语句,但没有从程序中获得任何输出。
gcc是否可能只是忽略函数调用?据我所知,这些陈述从来没有任何问题。
以下是代码:
unsigned strlen(char *string)
{
printf("ignored by gcc");
unsigned count = 0;
for(; *string++; count++);
return count;
}
int main()
{
char string[] = "something";
strlen(string);
return 0;
}
提前致谢。
答案 0 :(得分:7)
忽略函数的返回值是完全合法的。您调用printf()
(返回int
)的次数可能超过99%。
但是,正如几位人士在评论中所说,您在标准库函数之后调用了函数strlen()
。根据C99的7.1.3:2:
如果程序在上下文中声明或定义标识符 它是保留的(除了7.1.4允许的),或定义保留 标识符作为宏名称,行为未定义。
这里编译器意外地发出警告,要么调用标准函数而不是你的函数,要么根本不调用任何函数(因为它知道它的 strlen()
应该没有副作用)。这是未定义行为可以做的事情之一。
答案 1 :(得分:2)
你收到消息是因为gcc的strlen
是用__attribute__((pure))
声明的,它告诉编译器它没有副作用,所以没有必要把它称为其他而不是使用其返回值。