2

我的代码有一个警告,我不知道如何避免它。这是一个代码片段

#include <arpa/inet.h>
int main(void) {
        uint16_t portnbr=0;
        uint16_t n_portnbr = htons(portnbr);
        return n_portnbr;
}

编译器:

/usr/bin/g++ -Wconversion -Wall  -O2 a.cpp

输出:

a.cpp:4: warning: conversion to 'short unsigned int' from 'int' may alter its value

是否可以避免警告?没有修改 CFLAGS 的选项

我的编译器是 gcc 版本 4.3.4 [gcc-4_3-branch revision 152973] (SUSE Linux)

4

3 回答 3

4

这似乎是 glibc 中的一个错误。请参阅此错误报告

于 2012-04-25T14:59:20.777 回答
2

为了提高效率htons,宏和亲戚经常被宏重载。尝试类似的东西

uint16_t n_portnbr = (htons)(portnbr);

看看这是否解决了你的问题,这个语法确保触发函数而不是宏。

如果是这种情况,那真的很遗憾他们弄错了。然后,您应该尝试仅针对该版本关闭该宏。

于 2012-04-25T14:58:33.797 回答
1

可能只是缺少原型,这就是警告听起来的样子。

尝试手动声明该htons()函数,看看是否有帮助。如果是这样,您需要调查您的标题。

声明的Linux 手册页htons()

POSIX.1-2001。

一些系统需要包含 <netinet/in.h> 而不是 <arpa/inet.h>。

更新:正如评论中所指出的,这是 C++,所以它不应该“遭受”函数的隐式声明。奇怪的。我建议阅读预处理代码,也许htons()是一个由于某种原因表现得很奇怪的宏。

于 2012-04-25T14:56:15.023 回答