首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >gcc奇怪的C编译只有在警告时才能纠正

gcc奇怪的C编译只有在警告时才能纠正
EN

Stack Overflow用户
提问于 2014-04-29 06:51:07
回答 2查看 97关注 0票数 0

我有一个很奇怪的编译问题。

我想要使十六进制/十进制转换轻巧(没有stdio)。

以下是没有警告但结果为假的输出(应该是2014年):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
xx@xxx:~/fcgi/test# sudo gcc dec.c -lm -o dec
xx@xxx:~/fcgi/test# ./dec 7DE
0

和输出时,有警告,但结果是正确的!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
xx@xxx:~/fcgi/test# sudo gcc dec.c -lm -o dec
In file included from libhex.h:24:0,
                 from dec.c:2:
libhex.c: In function ‘ishexchar’:
libhex.c:54:12: warning: comparison between pointer and integer [enabled by default]
libhex.c:54:23: warning: comparison between pointer and integer [enabled by default]
libhex.c:54:33: warning: comparison between pointer and integer [enabled by default]
libhex.c:54:45: warning: comparison between pointer and integer [enabled by default]
libhex.c:54:55: warning: comparison between pointer and integer [enabled by default]
libhex.c:54:66: warning: comparison between pointer and integer [enabled by default]
xx@xxx:~/fcgi/test# ./dec 7DE
2014

下面是函数的代码,它检查正确的十六进制字符的代码,其中有一个非常小的错误(在c之前没有),但是工作函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int ishexchar (const int *c) {
    return (c < 48 || (c > 57 && c < 65) || (c > 70 && c < 97) || c > 102) ? 1 : 0;
};

它的名称是这样的(其中c是一个使用int格式的字符)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ishexchar(&c);

谢谢你的阅读。如果你有同样的编译问题,告诉我。同时也告诉我这种轻蔑是否能让你感到不安,因为一旦问题解决,我就会在github上发布代码。就我的目的而言,它适用于尚未完全实现stdio的FastCGI中。

编辑:这里,用于十六进制/十进制转换的librairy的github:https://github.com/kevmuret/libhex

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-29 06:56:32

丢失的*是一个大错误。您的函数就是将指针值(即内存地址)与整数进行比较。这就解释了这个警告,它告诉你你在做什么,以及为什么这可能是错误的。

在与int比较时,要么更改函数的签名,要么取消指针引用(以比较实际的int值):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
return (*c < 48 || (*c > 57 && *c < 65) || (*c > 70 && *c < 97) || *c > 102) ? 1 : 0;

或者写:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int ishexchar (int c)
{}
//and call like:
ishexchar(c);

PS:

您不需要将字符转换为int,您可以将charint进行比较

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
char x = 'a';
if (x == 97)
   puts("This is perfectly valid");

但是,不确定您的函数:c < 48意味着您认为像"!这样的字符是有效的十六进制字符。我不会。有效的字符是0-9,A-F和a-f。不多,不少:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int ishexchar(int c)
{
    return ((c > 47 && c < 58) || (c > 96 && c < 103) || (c > 64 && c < 71) ? 1 : 0);
}

这应该能起作用,参考代码页

记住这一点:ASCII表

票数 0
EN

Stack Overflow用户

发布于 2014-04-29 06:54:53

很明显,您正在执行警告所述的操作,即将指针与整数进行比较。

如果cconst int *,那么c < 48会比较指针和整数。

传递指向这样一个函数的指针是没有意义的;移除*并使其只

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
bool ishexchar(int c);

如果您确实希望传递一个指针,则需要在函数中取消引用该指针,即使用*c获取c所指向的值。我不明白“复制内存”的意义,但是,您确实不需要传递指针,因为字符不大于指针--没有胜利。

此外,当您可以避免使用“魔术常量”时,您不应该在代码中使用“魔术常量”。除非您试图只针对ASCII,否则对十进制数字的比较应该与'0''9'进行比较。您不能依赖字符any和any具有任何特定的顺序或编码,所以如果您不想成为ASCII-只有您必须以不同的方式进行这些测试。

最后,所有这些布尔值的数值结果都是0或1,使用?:来强制它是没有意义的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23368113

复制
相关文章
在 MSBuild 编译项目时阻止输出所有的警告信息
大型旧项目可能存在大量的 Warning,在编译之后 Visual Studio 会给出大量的警告。Visual Studio 中可以直接点掉警告,然而如果是通过命令行 msbuild 编译的,那如何不要让警告输出呢?
walterlv
2020/02/10
1.4K0
C++ gcc编译过程
第一步:预处理 将源代码的.c 、.cpp 、.h 等文件包含到一个文件中。在这个过程中会使用一些预处理指令要求编译器使用什么样的方式包含这些文件。预处理结束之后对于c语言编译器会生成一个.i 文件。C++会生成.ii文件。
老九学堂-小师弟
2019/09/20
5.3K0
gcc编译器参数_gcc for c4droid
虽然我们称Gcc是C语言的编译器,但使用gcc由C语言源代码文件生成可执行文件的过程不仅仅是编译的过程,而是要经历四个相互关联的步骤∶预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编(Assembly)和链接(Linking)。
全栈程序员站长
2022/11/04
9710
再议GCC编译时的静态库依赖顺序问题
使用上面的Makefile编译,将会遇到如下所示的“undefined reference”问题:
一见
2018/08/06
3.8K0
gcc的编译命令_cmake 编译
—————-加入新公司后,基本上是一键式打包脚本,对于GCC基本上快忘了,重新拾起。
全栈程序员站长
2022/11/04
1.9K0
gcc编译的过程
预处理是读取 c 源程序,对其中的伪指令(以 # 开头的指令,也就是宏)和特殊符号进行“替代”处理;经过此处理,生成一个没有宏定义、没有条件编译指令、没有特殊符号的输出文件。这个文件的含义同没有经过预处理的源文件是相同的,仍然是 C 文件,但内容有所不同。
Gnep@97
2023/08/10
2750
gcc编译的过程
用gcc编译c语言程序以及其编译过程
对于初学c语言编程的我们来说,学会如何使用gcc编译器工具,对理解c语言的执行过程,加深对c语言的理解很重要!!!
黑泽君
2018/10/11
1.6K0
linux下使用gcc编译运行C程序
该文介绍了在Linux系统中,使用gcc编译C程序的方法和步骤,包括编译和链接的过程,以及使用arm-linux-gcc交叉编译在arm板中运行C程序的过程。
诺谦
2018/01/03
7.4K0
linux下使用gcc编译运行C程序
linux下使用gcc编译运行C程序
该文介绍了在Linux系统中,使用gcc编译C程序的方法和步骤,包括编译和链接的过程,以及使用arm-linux-gcc交叉编译在arm板中运行C程序的过程。
诺谦
2018/01/03
6.2K0
linux下使用gcc编译运行C程序
GCC命令编译
从 hello.c 到 hello(或 a.out)文件, 必须历经 hello.i、 hello.s、 hello.o,最后才得到 hello(或a.out)文件,分别对应着预处理、编译、汇编和链接 4 个步骤,整个过程如图所示。
全栈程序员站长
2022/11/08
1.1K0
GCC命令编译
ubuntu gcc编译时对’xxxx’未定义的引用问题
http://www.cnblogs.com/oloroso/p/4688426.html
bear_fish
2018/09/19
8.2K0
编译GCC 7.1.0
其中 --disable-multilib这个是交叉编译功能, 比如希望在64位系统下也能编译出32位的程序 最后会将gcc安装到 /usr/local/bin/gcc
扫帚的影子
2018/09/05
1K0
【C 语言】Windows 下使用 gcc 编译器 ( 常用的编译器 | Qt 中的 gcc 编译器 | 独立安装 MinGW )
在之前的 【Qt】Qt 开发环境安装 ( Qt 版本 5.14.2 | Qt 下载 | Qt 安装 ) 博客中 , 安装 QT 开发环境时 , 涉及到了 MSVC 和 MinGW 两个编译器 , 因此可以在 Qt 的安装目录中找到 MinGW 下的 GCC 编译器 ;
韩曙亮
2023/03/29
3.3K0
【C 语言】Windows 下使用 gcc 编译器 ( 常用的编译器 | Qt 中的 gcc 编译器 | 独立安装 MinGW )
GCC编译优化选项
查看GCC各选项打开的优化项:gcc -Q --help=optimizers。分为如下:
叫你不戴帽子
2019/01/03
8K0
c++ access函数_Linux中GCC编译C程序过程
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说c++ access函数_Linux中GCC编译C程序过程,希望能够帮助大家进步!!!
Java架构师必看
2022/09/12
3K0
gcc编译器如何使用_gcc编译器用什么语言写的
预处理(preprocessing):对 .c 源文件进行预处理,生成 .i 文件。 编译(compilation):对 .i 文件进行编译,生成 .s 汇编文件。 汇编(assembly):对 .s 文件进行汇编,生成 .o 目标文件。 链接(linking):对 .o 文件进行链接,生成可执行文件。
全栈程序员站长
2022/09/20
1.7K0
gcc编译器如何使用_gcc编译器用什么语言写的
gcc编译器
  上面2个文档:sequence.c、sequence.h 可以做出库的形式,让其他的文件调用。
墨文
2020/02/28
2.1K0
gcc编译器
mingw(gcc)编译openjpeg
版权声明:本文为博主原创文章,转载请注明源地址。 https://blog.csdn.net/10km/article/details/50580841
10km
2019/05/25
2K0
GCC 编译器的使用
视频观看地址:https://www.100ask.net/detail/p_5f338ae3e4b075dc42ad44a1/8
韦东山
2020/10/28
3.9K1
GCC 编译器的使用
只有程序员才能理解的事情
只听说过黑道上有黑话,但其实每个行业都有自己独特的语言,只有这个行业里的人才能够心领神会。软件开发行业里有大量的只有程序员才能听懂的话,只有程序员才能做出的事,只有程序员才能理解的心情。下面这11个,
程序员互动联盟
2018/03/16
6610
只有程序员才能理解的事情

相似问题

编译对齐结构给GCC以奇怪的警告

24

奇怪GCC短时转换警告

65

gcc编译时警告输出的最佳实践?

20

只有当放置警告()时,$.ajax才能工作

22

只有在找到库时才能编译字节文件

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文