免费注册 查看新帖 |

Chinaunix

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

[C] 求助:GCC编译选项加上 -std=c99 反而不行了 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-10-03 15:39 |只看该作者 |倒序浏览
正常情况下,我直接gcc source.c,有时遇到for (int i = 0; ) 这样的声明,编译选项就加上-std=c99
经验里加上后成功率总是更高的,可最近发现,加上后反而编译不过了。代码如下:

#include <stdio.h>
#include <string.h>
#include <netinet/ip_icmp.h>

void PackICMP(int id, struct icmp *pack)
{
        memset(pack, '\0', sizeof(struct icmp));
        pack->icmp_type = ICMP_ECHO;
        pack->icmp_code = 0;
        pack->icmp_cksum = 0;
        pack->icmp_hun.ih_idseq.icd_id = 0;
        pack->icmp_hun.ih_idseq.icd_seq = id + 2;
}

int main(void)
{
        struct icmp XX;
        PackICMP(sizeof(XX), &XX);

        return 0;
}

[root@localhost ~]# gcc -v
gcc 版本 4.1.2 20080704 (Red Hat 4.1.2-51)

编译结果为:
[root@localhost ~]# gcc template.c
[root@localhost ~]# gcc template.c -std=c99
template.c:5: 警告:‘struct icmp’ 在形参表内部声明
template.c:5: 警告:它的作用域仅限于此定义或声明,这可能并不是您想要的
template.c: In function ‘PackICMP’:
template.c:7: 错误:‘sizeof’ 不能用于不完全的类型 ‘struct icmp’
template.c:8: 错误:提领指向不完全类型的指针
template.c:9: 错误:提领指向不完全类型的指针
template.c:10: 错误:提领指向不完全类型的指针
template.c:11: 错误:提领指向不完全类型的指针
template.c:12: 错误:提领指向不完全类型的指针
template.c: In function ‘main’:
template.c:17: 错误:‘XX’ 的存储大小未知


是不是netinet/ip_icmp.h里面定义的struct icmp过于复杂,包含struct, union, #define等,-std=c99不能识别其定义?

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
2 [报告]
发表于 2012-10-03 15:46 |只看该作者
本帖最后由 linux_c_py_php 于 2012-10-03 15:47 编辑

  1.            c99
  2.            c9x
  3.            iso9899:1999
  4.            iso9899:199x
  5.                ISO C99.  Note that this standard is not yet fully supported; see <http://gcc.gnu.org/gcc-4.4/c99status.html> for more information.  The
  6.                names c9x and iso9899:199x are deprecated.
复制代码
不清楚, 但职业的C89玩家是不会在for内定义变量的, 建议你也那么做.

论坛徽章:
0
3 [报告]
发表于 2012-10-03 16:29 |只看该作者
本帖最后由 123456XP 于 2012-10-03 16:29 编辑

for()里面定义变量,很好的限制了“作用域”。

有几个
for(int i = 0; i < xx; ++i)
for(int i = 0; i < xx; ++i)
for(int i = 0; i < xx; ++i)
如果放在外面要为i们想不同的名字。
代码风格应该与时俱进!

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
4 [报告]
发表于 2012-10-03 17:04 |只看该作者
123456XP 发表于 2012-10-03 16:29
for()里面定义变量,很好的限制了“作用域”。

有几个


關鍵是 C89 它不支持 for(int i = ...) 這種用法,如果你的代碼要用 C89 編譯器編譯,就不能這麼寫。

论坛徽章:
0
5 [报告]
发表于 2012-10-04 07:47 |只看该作者
gcc -D_GNU_SOURCE -std=c99 template.c
gcc -D_BSD_SOURCE -std=c99 template.c

应该是那什么什么BSD和SYSTEM V的问题,和c89,c99无关。

论坛徽章:
0
6 [报告]
发表于 2012-10-04 08:57 |只看该作者
果然,头文件里
struct icmp
{
}
上面有个#ifdef __USE_BSD
不过我用
gcc -D_GNU_SOURCE -std=c99 template.c
gcc -D_BSD_SOURCE -std=c99 template.c
都能编译通过。

论坛徽章:
0
7 [报告]
发表于 2015-05-21 22:31 |只看该作者
太感谢l,我用的是-D__USE_BSD  始终不行,换成-D_BSD_SOURCE就通过l,为什么这是??
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP