免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3020 | 回复: 8
打印 上一主题 下一主题

[函数] 十万火急,关于没有return语句的可执行档在makefile command line [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-05-03 22:37 |只看该作者 |倒序浏览
本帖最后由 dodolo0k 于 2010-05-04 03:04 编辑

现在有一个add_size.c档:
  1. int main(int argc, char**argv)  
  2. {
  3.                 ......;
  4.         if(f_out == NULL) {
  5.                 printf("Can not open \"%s\" for appending\n", argv[3]);
  6.                 return 0;//还有其他异常都会有return 0语句
  7.         }

  8.         fwrite(size_buf, 1, SIZE_BUF_SIZE, f_out);
  9.         fwrite(pu8SrcBuffer, 1, size, f_out);
  10.         free(pu8SrcBuffer);
  11.         fclose(f_out);//正常会走到这里
  12. }
复制代码
如果异常有return 0语句;
如果是正确流程,到函数执行到最后语句都没有return 0;

compile成可执行档add_size

在makefile中的command line使用,

请问:
tab@add_size -b $(BIN)/_dspdata $(BIN)/dspdata.bin
shell得到的值是多少?

shell 行得到的值是正常值0,make才会继续往下执行吧?

我的结果:
在msys上make总是report error并stop;可是其它人却没有发现这个问题。。。
我现搞清楚是什么原因?

补充:source code在六楼

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2010-05-03 23:27 |只看该作者
main函数正常结束,默认是return 0,
而且这条语句可以省略。

论坛徽章:
0
3 [报告]
发表于 2010-05-04 00:06 |只看该作者
本帖最后由 dodolo0k 于 2010-05-04 00:22 编辑

不知道是不是不同的环境结果会不一样,我在msys(cygwin的简化版本)上直接调用add_size可执行档,然后echo $?看到的值是160。。。

如下图,有一个add_size.exe和一个add_sizenoreturn.exe,它们都是使用minGW编译的,
它们只有一个区别,一个在正常执行完了之后有return 0;语句,一个没有;
可以看到它们执行完了之后shell的值是0和160。

1.JPG (37.46 KB, 下载次数: 29)

1.JPG

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
4 [报告]
发表于 2010-05-04 00:54 |只看该作者
实际上,C是不会加return 0的,所以返回值是fclose的返回值。而fclose不一定会返回0的……(虽然貌似如果有错就返回-1,我翻翻标准去……)

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
5 [报告]
发表于 2010-05-04 00:59 |只看该作者
标准说如果成功,应该是返回0的,而如果失败,会返回EOF(即-1),怪异……

论坛徽章:
0
6 [报告]
发表于 2010-05-04 02:34 |只看该作者
干脆把代码放出来,谁都会写这种代码。。。

  1. /*
  2.         This function calculate size of the input file to the output file.
  3. */
  4. #include <stdio.h>

  5. #define SIZE_BUF_SIZE                         4

  6. int main(int argc, char *argv[])
  7. {
  8.         FILE *f_in;
  9.         FILE *f_out;
  10.         long size=0;
  11.         unsigned char size_buf[SIZE_BUF_SIZE];
  12.         char *pu8SrcBuffer;

  13. // option check
  14.         if(argc != 4){
  15.                 printf("\n");
  16.                 printf("Usage: %s {option} {input file}\n", argv[0]);
  17.                 printf("\n");
  18.                 printf("option: -b -> binary \n");
  19.                 printf("\n");
  20.                 return 0;
  21.         }
  22.         if(argv[1][0] == '-' && argv[1][2] == '\0'){        //processing option
  23.                 switch(argv[1][1]){
  24.                         case 'b':
  25.                                 break;
  26.                         default :
  27.                                 printf("Wrong option!\n");
  28.                                 return 0;
  29.                 }
  30.         }
  31.         else{
  32.                         printf("Wrong option!\n");
  33.                         return 0;
  34.         }

  35. // get input file size
  36.         f_in = fopen(argv[2], "rb");
  37.         if(f_in == NULL) {
  38.                 printf("open file failed\n");
  39.                 return 0;
  40.         }
  41.         fseek( f_in, 0, SEEK_END );
  42.         size = ftell( f_in );

  43. // transfer size
  44.         size_buf[3] = ((size>>24)&0xFF);
  45.         size_buf[2] = ((size>>16)&0xFF);
  46.         size_buf[1] = ((size>>8)&0xFF);
  47.         size_buf[0] = (size&0xFF);

  48. // malloc buffer
  49.         pu8SrcBuffer = (char *)malloc(size);
  50.         if(NULL ==pu8SrcBuffer)
  51.         {
  52.                 printf("Can not alloc buffer(size=0x%x) for appending\n", size);
  53.                 fclose(f_in);
  54.                 return 0;
  55.         }

  56. // seek src to begin
  57.         if( 0 != fseek(f_in, 0, SEEK_SET) )
  58.         {
  59.                 printf("Can not seek \"%s\" for read\n", argv[2]);
  60.                 fclose(f_in);
  61.                 return 0;
  62.         }

  63.         if( size != fread(pu8SrcBuffer, 1, size,f_in) )
  64.         {
  65.                 printf("Read \"%s\" failed\n", argv[2]);
  66.                 fclose(f_in);
  67.                 return 0;
  68.         }
  69.         fclose(f_in);

  70. // open target
  71.         f_out = fopen(argv[3], "wb+");
  72.         if(f_out == NULL) {
  73.                 printf("Can not open \"%s\" for appending\n", argv[3]);
  74.                 return 0;
  75.         }

  76.         fwrite(size_buf, 1, SIZE_BUF_SIZE, f_out);
  77.         fwrite(pu8SrcBuffer, 1, size, f_out);
  78.         free(pu8SrcBuffer);
  79.         fclose(f_out);

  80.         return 0;//该行之前没有,这里是我添加的
  81. }
复制代码
可以帮我试试在linux环境下情况是怎样的?
打开或者注释掉最后一句return 0;分别编译成两个不同的可执行档,然后在命令行直接执行之后使用echo $?查看该执行档返回给shell的值。

也可以写个简单的makefile

test:
<tab>@add_size -b inputBinaryFileName outputBinaryFileName
<tab>@echo "If go here, success, else failure"

保存为makefile,在命令行敲入make

论坛徽章:
0
7 [报告]
发表于 2010-05-04 14:00 |只看该作者
顶起来,请各位大牛帮我解释下啦,这个问题一定要搞清楚

论坛徽章:
0
8 [报告]
发表于 2010-05-04 16:19 |只看该作者
再顶!!

论坛徽章:
0
9 [报告]
发表于 2010-05-04 22:17 |只看该作者
帮着你顶!快点解决吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP