1

我试图调用一个自写的函数而不处理它的返回值。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;
}

提前致谢。

4

2 回答 2

7

忽略函数的返回值是完全合法的。您调用的次数可能超过 99% printf()(返回一个int)。

但是,正如一些人在评论中所说,您strlen()在标准库函数之后调用了您的函数。根据 C99 的 7.1.3:2,这是非法的:

如果程序在保留标识符的上下文中声明或定义标识符(7.1.4 允许的除外),或将保留标识符定义为宏名称,则行为未定义。

在这里,编译器出乎意料地发出警告,要么调用标准函数而不是你的函数,要么根本不调用函数(因为它知道 strlen()应该没有副作用)。这是未定义行为可以做的事情之一。

于 2012-09-21T19:57:23.613 回答
2

You get the message because gcc's strlen is declared with __attribute__((pure)), which tells the compiler that it has no side effects, so there's no point in calling it other than to use its return value.

于 2012-09-21T20:46:33.807 回答