使用stdbool.h时出现意外的编译器行为

时间:2013-01-25 03:41:49

标签: c

这是我的代码

main.c

#include <stdio.h>
#include <stdbool.h>
#include "func.h"

int main () {
  int counts = 10;
  printf("Expected: %lF and rcount %lF,%lF\n",
          counts * 30* 0.156, rcount(0,30), rcount(30,0));

  return 0;
}

这是我简化的func.h

#ifndef FUNC_INCLUDED
#define FUNC_INCLUDED

float rcount(int m, int n);

#endif

最后来了我的func.c

#include <stdio.h>
#include <stdbool.h>
#include <math.h>
#include "func.h"

double rcount(int m, int n) {
  double series1 = ((double)m/2)*(10+(double)m*10)/20;
  double series2 = ((double)n/2)*(10+(double)n*10)/20;
  return (series2 > series1) ? series2-series1 : series1-series2;
}

现在,如果我执行,我会得到rcount()的随机值,而如果我从main中删除#include<stdbool.h>,我会得到正确的值。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

正如@Carl Norum所说,“必须有一些你没有告诉我们的东西”是非常有说服力的。

rcount()调用是printf()语句返回其double类型,但是printf()因为原型而期望浮动,或者如果没有看到原型则期望int。在任何一种情况下,printf()都会显示错误的数据。

尝试3件事:1)使用FUNC_INCLUDED以外的其他定义,稍微可能stdbool.h正在使用该宏。 2)改变你的原型和实现返回相同的类型,最好是双倍。 3)直接在main()之前制作rcount()原型的冗余副本。

extern double rcount(int m, int n);

使用/缺少stdbool.h是一个红鲱鱼。有/没有它,你的编译正在使用一些不同的文件,选项等(除非它的FUNC_INCLUDED)