标题:有没有办法,在C代码中声明,编辑的时候使用C99标准编译呢
只看楼主
kkbbggtt
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2012-8-7
结帖率:50%
已结贴  问题点数:10 回复次数:10 
有没有办法,在C代码中声明,编辑的时候使用C99标准编译呢
    我是在ubuntu10.04系统下做C语言开发,程序中使用到有关unicode的数据。
在命令行下敲gcc ... “-std=c99”... 编译时没有产生警告。
于是在Makefile中的生成目标文件那一部分也写了 gcc ... “-std=c99” ...,但是之后使用make编译时,产生了一屏幕警告,内容如下:
warning: universal character names are only valid in C++ and C99,请问这如何消除??
搜索更多相关主题的帖子: C语言 warning character 办法 
2012-09-06 11:38
kkbbggtt
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2012-8-7
得分:0 
为毛都没有回应呢- -!
2012-09-10 13:25
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:10 
使用Unicode跟C99有毛关系

授人以渔,不授人以鱼。
2012-09-10 13:35
kkbbggtt
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2012-8-7
得分:0 
回复 3楼 TonyDeng
我也搞不清楚其中的关系,只是按照C99标准编译的话,不会出警告,否则警告一大屏幕,不太好看。。。
2012-09-10 14:58
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
你怎么用的Unicode字符串?给个使用这种东西的部分看看。
如果你不是显式使用wchar_t,那么编译的时候需要指示用Unicode编译。

授人以渔,不授人以鱼。
2012-09-10 15:07
kkbbggtt
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2012-8-7
得分:0 
回复 5楼 TonyDeng
大致如下:
情况一:    static char *array[] = {"\u1000", "\u1001", "\u1002" ...};
然后编译时,数组中有几个元素就出几个警告;
情况二:    if(0 != strncmp(str_in, "\u1000", strlen("\u1000"))) {
                        .....;
                  }
这样也会出警告。
警告是这样的:warning: universal character names are only valid in C++ and C99。
2012-09-10 15:13
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
Unicode字符常量要在前面加L,比如L'\u1000'。你定义的array是char类型,这个不是Unicode编码字符类型,应是wchar_t。再有,用""括着的是字符串,不是字符,字符是''。Unicode编码的所有字符函数都有另外的版本,不是strncmp()这种的,带有w标识那种才是。

char是8位的,wchar_t是16位的,你依据这个标准来看自己的代码就知道哪里有问题了。\u1000这类,已经是16位整数,编译器怎么能够把它理解为8位的char?

授人以渔,不授人以鱼。
2012-09-10 15:21
kkbbggtt
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2012-8-7
得分:0 
回复 7楼 TonyDeng
我测试了下,定义方式更改为:
    static wchar_t array[] = {L'\u1000', L'\u1001', L'\u1002' ...};

编译文件时,使用:gcc main.c -o main命令,还是会出警告,警告与以前一致;
使用gcc "--std=c99" main.c -o main命令,则没有出现警告。

这是不是说明,c89标准不支持这个类型的数据呢?

还有,我前边的定义方式:static char *array[] = {"\u1000", "\u1001", "\u1002" ...}; 是因为后边需要大量的字符串比较和拼接操作,
这样的单字节字符串也是可以的吧- -!
2012-09-10 16:02
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
wchar_t是C99后新增的数据类型,C89没有。使用wchar_t的字符,不管是什么字符,都是16位的,包括纯英文(即传统的ASCII字符),也都是扩展为16位的,你写L'A',是16位的,不再是8位的char。对Unicode编码的字符串,数组中每个元素都是16位整数,必须使用宽字符格式的字符串函数,废弃旧式的函数。如果你真要使用单、双字节混合的字符串,即DBCS编码的字符串,就沿用char数据类型即可,但此时必须自己识别字符串中哪些字符是ASCII字符、哪些是扩展字符,总之,此时程序只按8位运算,不管那是什么字符,判别的责任在你身上。

使用哪种字符串编码,是每个程序员都必须慎重考虑的,整个程序的编写,都必须与此配合。

授人以渔,不授人以鱼。
2012-09-10 16:13
kkbbggtt
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2012-8-7
得分:0 
多谢大神!!!
不过我想知道有没有办法在代码中告诉编译器,编译时使用c99标准编译呢?
比如C++有个命名空间之类的东西如:using namespace std;编译时,会把cin、cout编译成std.cin、std.cout。
如果C语言代码中加上一句什么什么的,就可以控制编译器标准就太好了~~~
2012-09-10 16:28



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-380819-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.884007 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved