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

1 c gcc function 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;
}
Run Code Online (Sandbox Code Playgroud)

提前致谢.

Pas*_*uoq 7

忽略函数的返回值是完全合法的.你可能在你调用的时间超过99%printf()(返回一个int).

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

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

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