LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
123
返回列表 发新帖
楼主: 无心徘徊

关于argc,argv[]的问题,在线等

[复制链接]
发表于 2005-6-20 20:34:08 | 显示全部楼层
void main写法是错误的,不符合C标准的。

1.9 main() 的正确定义是什么?  void main() 正确吗?
参见问题 11.11 到 11.16。(这样的定义不正确)。

11.11 怎样正确声明 main()?
int main(), int main(void) 或者 int main(int argc, char *argv[]) (显然 argc 和 argv 的拼写可以随便)。 参见问题 11.12 到  11.16。

参考资料: [ISO, Sec. 5.1.2.2.1, Sec. G.5.1]; [H&S, Sec. 20.1 p. 416]; [CT&, Sec. 3.10 pp. 50-51]。
11.16 我一直用的那本书《熟练傻瓜C语言》总是使用 void main()。
可能这本书的作者把自己也归为目标读者的一员。很多书不负责任地在例子中使用 void main(), 并宣称这样是正确的。但他们错了。
回复 支持 反对

使用道具 举报

发表于 2005-6-20 23:44:39 | 显示全部楼层
windows下常用void,linux下我一直用int
回复 支持 反对

使用道具 举报

发表于 2005-6-21 10:44:58 | 显示全部楼层
Post by nait
windows下常用void,linux下我一直用int

我一般都用int main和return 0;
:cool:
回复 支持 反对

使用道具 举报

发表于 2005-6-21 10:51:21 | 显示全部楼层
Post by xiaosir
void main写法是错误的,不符合C标准的。

1.9 main() 的正确定义是什么?  void main() 正确吗?
参见问题 11.11 到 11.16。(这样的定义不正确)。

11.11 怎样正确声明 main()?
int main(), int main(void) 或者 int main(int argc, char *argv[]) (显然 argc 和 argv 的拼写可以随便)。 参见问题 11.12 到  11.16。

参考资料: [ISO, Sec. 5.1.2.2.1, Sec. G.5.1]; [H&S, Sec. 20.1 p. 416]; [CT&, Sec. 3.10 pp. 50-51]。
11.16 我一直用的那本书《熟练傻瓜C语言》总是使用 void main()。
可能这本书的作者把自己也归为目标读者的一员。很多书不负责任地在例子中使用 void main(), 并宣称这样是正确的。但他们错了。


你引用的这些问题是从哪儿来的?书里还是网上?
回复 支持 反对

使用道具 举报

发表于 2005-6-21 12:01:15 | 显示全部楼层
这在ISO的c99标准中也对这个问题有说明。
回复 支持 反对

使用道具 举报

发表于 2005-6-21 13:34:58 | 显示全部楼层
Post by nait
我原来也一直以为默认会返回零,后来有一次程序执行没问题,但echo $?发现不是0,才知道潜意识错了
什么事都不能想当然啊


C++的main里不写return是会默认return 0的,而c不会。
回复 支持 反对

使用道具 举报

发表于 2005-6-21 15:31:03 | 显示全部楼层
恩,认真一下。上午去图书馆找《C语言参考手册》,感觉这应该是能找到的最权威的吧,要不就只能花美刀去买ISO的文件了
在219页第一行,有如下的说法:“如果到达main函数体末尾而没有遇到返回语句,则视为执行return 0;”
不过gcc确实没有返回0,VS2003的编译器cl似乎是返回了一个0的,小弟不大懂汇编,各位看看:

  1. ; Listing generated by Microsoft (R) Optimizing Compiler Version 13.10.3077

  2.         TITLE        try.c
  3.         .386P
  4. include listing.inc
  5. if @Version gt 510
  6. .model FLAT
  7. else
  8. _TEXT        SEGMENT PARA USE32 PUBLIC 'CODE'
  9. _TEXT        ENDS
  10. _DATA        SEGMENT DWORD USE32 PUBLIC 'DATA'
  11. _DATA        ENDS
  12. CONST        SEGMENT DWORD USE32 PUBLIC 'CONST'
  13. CONST        ENDS
  14. _BSS        SEGMENT DWORD USE32 PUBLIC 'BSS'
  15. _BSS        ENDS
  16. $$SYMBOLS        SEGMENT BYTE USE32 'DEBSYM'
  17. $$SYMBOLS        ENDS
  18. _TLS        SEGMENT DWORD USE32 PUBLIC 'TLS'
  19. _TLS        ENDS
  20. FLAT        GROUP _DATA, CONST, _BSS
  21.         ASSUME        CS: FLAT, DS: FLAT, SS: FLAT
  22. endif

  23. INCLUDELIB LIBC
  24. INCLUDELIB OLDNAMES

  25. PUBLIC        _main
  26. ; Function compile flags: /Odt
  27. _TEXT        SEGMENT
  28. _argc$ = 8                                                ; size = 4
  29. _argv$ = 12                                                ; size = 4
  30. _main        PROC NEAR
  31. ; File c:\try.c
  32. ; Line 2
  33.         push        ebp
  34.         mov        ebp, esp
  35. ; Line 3
  36.         xor        eax, eax
  37.         pop        ebp
  38.         ret        0
  39. _main        ENDP
  40. _TEXT        ENDS
  41. END

复制代码


源程序:

  1. main(int argc, char *argv[])
  2. {
  3. }

复制代码
回复 支持 反对

使用道具 举报

发表于 2005-6-21 19:56:54 | 显示全部楼层
用gcc -std=c99编译,是可以看到返回0的。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表