为什么编译器警告并忽略对我的函数strlen的调用?

时间:2012-09-21 19:25:58

标签: c function gcc call

我尝试调用自编函数而不处理其返回值。 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;
}

提前致谢。

2 个答案:

答案 0 :(得分:7)

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

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

,这是非法的
  

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

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

答案 1 :(得分:2)

你收到消息是因为gcc的strlen是用__attribute__((pure))声明的,它告诉编译器它没有副作用,所以没有必要把它称为其他而不是使用其返回值。