【问题标题】:Why does the compiler warn about and ignore the call to my function strlen? [closed]为什么编译器会警告并忽略对我的函数 strlen 的调用? [关闭]
【发布时间】:2012-09-21 19:25:58
【问题描述】:

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

提前致谢。

【问题讨论】:

  • 您偶然发现了一个同名的标准 C 函数。除非您有充分的理由,否则请使用该理由而不是自己制作。
  • 调用你的函数,gcc使用内置的strlen
  • 关闭似乎没有必要。与这里关于一个人代码的非常具体细节的无数问题相比,其他人更有可能遇到这种情况。

标签: c function gcc call


【解决方案1】:

忽略函数的返回值是完全合法的。在调用 printf()(返回 int)的次数中,您可能会执行超过 99% 的操作。

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

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

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

【讨论】:

    【解决方案2】:

    您收到消息是因为 gcc 的 strlen 是用 __attribute__((pure)) 声明的,它告诉编译器它没有副作用,所以除了使用它的返回值之外,调用它没有意义other价值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-16
      • 2021-06-16
      • 1970-01-01
      相关资源
      最近更新 更多