LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: 无心徘徊

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

[复制链接]
发表于 2005-6-13 08:52:30 | 显示全部楼层
main函数那些规定可以写可以不写 但是不写main函数返回值 可以通过编译 但是会有警告。 至于那个printf语句应该是不对的,至少是不符合作者的意图的。 至于那个int argc 我没有看出毛病呀!要是包含了头文件,不应该有问题, :beat 呵呵!
回复 支持 反对

使用道具 举报

发表于 2005-6-13 09:07:45 | 显示全部楼层
Ansi 没有明文规定,但是,不符合惯例就是违背规定,你的程序有一大堆告警
编译都告警,就别说 lint 了,所以养成良好的习惯才是真的,如果在windows
下编程,自然不用 return 可是,unix 需要返回值 就算可以忽略但仍然需要
这就是规定,没有小程序,只有大程序员
回复 支持 反对

使用道具 举报

发表于 2005-6-16 21:02:46 | 显示全部楼层
给试了一下,编译没错误啊.如果可执行名字为main,在终端里执行main a g,怎么出现unknown host a结果呢?  (-:
回复 支持 反对

使用道具 举报

发表于 2005-6-17 09:55:01 | 显示全部楼层
Post by gsuse
Ansi 没有明文规定,但是,不符合惯例就是违背规定,你的程序有一大堆告警
编译都告警,就别说 lint 了,所以养成良好的习惯才是真的,如果在windows
下编程,自然不用 return 可是,unix 需要返回值 就算可以忽略但仍然需要
这就是规定,没有小程序,只有大程序员


什么是惯例;gnu还是kernel 我记得 像bsd等稍微老一点的格式都是这样的(新的没心思关心过)

int
main(argc, argv)
int argc;
char *argv[];
{
      if (argc < 2)
             {
                    puts("Usage : test arg1..");
                    return 0;
          }
         printf("argv[1] is %s \n", argv[1]);
         return 1;
}

这样去写算不算惯例,可是这是unix源代码的写法,不知道多少大师都这么写。
后来就成这样了
int
main(int argc, char **argv)
{
      .........
}
关于main函数的详细内容大家还是参考一下unix高级环境编程的第七章 ,讲的很详细。
关于格式的问题我有些个人见解。这里班门弄斧了。
1:首先,也就是第一点,是什么呢。当然是个性化。这个个性化来源于哪里呢,做梦梦见的么,
   那肯定不行,基本是遵照gnu风格或者基于unix风格(她俩也长得挺像的么)
2:然后,然后干啥呢?然后就是然后,然后再遵照客户的意见了,客户说怎么看着方便那
   你就怎么来。
3:七次呢:其次就是老板了。
举个例子:
int
main(void)
{
}
看着不爽 现在的linux 都变了
int main(void)
{
}

还有。。linux 内核风格
if (......) {
     ......
   ......
}

这个看起来还可以,不过当你的if else 和代码多了的时候找{}对应关系就烦死了。所以
如果不是给内核写补丁(当然给内核写补丁一定要遵照人家得标准么)就这样:
if (......)
{
      .......
      .......
}

这样如果严格所进的代码,看起来非常整齐,不是为了好看 ,除了逻辑错误,很容易找的。
还有呢。。大师的风格,其实大家都是照着当年c创始人的风格,就是那本The c program
language 是这么写的吧。就是c语言圣经。
最后一句话:如果你成为大师,那么你的风格就是楷模。


这么个题目回复了这么多。 :ask
回复 支持 反对

使用道具 举报

发表于 2005-6-18 19:01:17 | 显示全部楼层
Post by dsub

return不写默认是返回0

你有试过吗?
回复 支持 反对

使用道具 举报

发表于 2005-6-18 23:42:08 | 显示全部楼层
嗯,试了一下。是我说错了,刚才看了一下gcc -S 不写return不会返回值,写了return 0才会有一个
        movl        $0, %eax
对不起
回复 支持 反对

使用道具 举报

发表于 2005-6-19 08:50:07 | 显示全部楼层
Post by dsub
嗯,试了一下。是我说错了,刚才看了一下gcc -S 不写return不会返回值,写了return 0才会有一个
        movl        $0, %eax
对不起

我原来也一直以为默认会返回零,后来有一次程序执行没问题,但echo $?发现不是0,才知道潜意识错了
什么事都不能想当然啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-19 23:05:17 | 显示全部楼层
谢谢这么多兄弟的热心帮助,我已经搞定那个程序 ,少了一个头文件,语法没有错误。不过,还是谢谢大家的帮助,我也是刚转到Linux不久的新手,万分感谢大家。
回复 支持 反对

使用道具 举报

发表于 2005-6-20 08:53:02 | 显示全部楼层
Post by nait
你有试过吗?

我倒是在ISO的标准里看到过,如果main运行到"}"而退出(意思是之前没有return或者exit),将返回0
回复 支持 反对

使用道具 举报

发表于 2005-6-20 10:17:26 | 显示全部楼层
Post by nait
你有试过吗?


肯定没有试过,我也在书上看过这样的话。
void main(void)
{
       puts("hello world");
}

gcc test.c -o test

./test

echo $?
12

呵呵 明白我的话吧。 返回值是显示的字符数(包括字符串结尾的字符)
这个编译的时候会有警告,如果向下面这样写
int main(void)
{
      puts("hello world");
}
结果会是怎样的。还是一样的 还是12
明白了么。
如果我这样写
void main(void)
{

}
int main(void)
{

}
返回值才是0;
这个我都实验过了。
回复 支持 反对

使用道具 举报

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

本版积分规则

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