Chinaunix首页 | 论坛 | 博客
  • 博客访问: 822496
  • 博文数量: 92
  • 博客积分: 1498
  • 博客等级: 上尉
  • 技术积分: 993
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-18 18:31
文章分类

全部博文(92)

文章存档

2013年(2)

2012年(3)

2011年(3)

2010年(61)

2009年(23)

分类: LINUX

2010-07-20 17:12:54

今天在一本书上所到多文件工程使用makefile编译源码的时候,练习了一个小例子,没想到练出问题了,首先给大
家列出我的目录结构和源码:


zhou@zhou:~/zhou/test$ ls
add  main.c  Makefile

main.c

/* main.c */
#include <stdio.h>
#include "add.h"

int main(void)
{
    float x= 1.2,y = 9.8;
    printf("x=%f,y=%f,x+y=%f\n",x,y,x+y);
    float m = add_float(x,y);
    printf("float x+y IS:%lf\n",m);
    
    return 0;    
}


进到add目录下:

zhou@zhou:~/zhou/test/add$ ls

add_float.c  add.h

zhou@zhou:~/zhou/test/add$ 


add_float.c

/* add_float.c */

#include

float add_float(float a, float b)

{

printf("a=%f,b=%f,a+b=%f\n",a,b,a+b);

return a+b;

}


add.h

/* add.h */

#ifdef __ADD_H__

#define __ADD_H__

extern int add_int(int a, int b);

extern float add_float(float a, float b);


#endif /*__ADD_H__*/


makefile

CFLAGS = -Iadd

VPATH=add

OBJS =  add_float.o main.o

TARGET = cacu


$(TARGET):$(OBJS)

$(CC) -o $(TARGET) $(OBJS) $(CFLAGS)

clean:

-$(RM) $(TARGET) 

-$(RM) $(OBJS)


 然后就make:
zhou@zhou:~/zhou/test$ make 
cc -Iadd   -c -o add_float.o add/add_float.c
cc -Iadd   -c -o main.o main.c
cc -o cacu add_float.o main.o -Iadd
zhou@zhou:~/zhou/test$ ls
add  add_float.o  cacu  main.c  main.o  Makefile
zhou@zhou:~/zhou/test$ 
zhou@zhou:~/zhou/test$ ./cacu 
x=1.200000,y=9.800000,x+y=11.000000
a=2.000000,b=1.900000,a+b=3.900000
float x+y IS:35.000000
上面红色标记的地方明显不对,参数传到add_float()中就变了,不知道什么原因,后来将这个小工程中
所有的float换成double,结果就全对了。
所以建议大家以后使用到浮点数的时候最好直接使用double。。嘿嘿。
哪位大牛有什么见解的话邮件(zhouyongfei1988@gmail.com)告诉我一声,小弟在此谢谢了。

ps:     在这首先感谢王聪学长和小雪。这个链接(传送门)是我贴上了我们在
小组邮件列表里面的讨论过程,看了这个应该就明白其中的原因了吧。

阅读(3317) | 评论(4) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-07-21 10:28:23

说一晚上是开玩笑而已。。呵呵,其实开始也没注意到这个宏的细节问题,甚至连那个宏看都没看,最后研究了半天发现是函数声明的问题,所以问题就立刻定位到你的那个头文件了。。。。说是高手也是开玩笑而已,大家互相学习下,呵呵,关于这个问题的深层次原因我整理了一下,在我blog,可以探讨下。。。http://blog.csdn.net/coder_jack/archive/2010/07/21/5751680.aspx

chinaunix网友2010-07-20 23:13:10

飞哥 确实是 宏定义的问题 但是我纳闷 哪三个高手 给你找了一晚上 很够哥们 哈哈

chinaunix网友2010-07-20 23:10:36

很幽默

chinaunix网友2010-07-20 22:22:02

靠!鄙视,你的头文件中 #ifdef __ADD_H__ 是错误的,应该#ifndef __ADD_H__ !!!!!!!!NOT def 靠!害我们三个高手搞了一晚上!还以为float中真的有你说的bug