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 リビジョン 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()、それが役立つかどうかを確認してください。その場合は、ヘッダーを調査する必要があります。

htons()クレームのLinux マニュアル ページ:

POSIX.1-2001。

一部のシステムでは、<arpa/inet.h> の代わりに <netinet/in.h> を含める必要があります。

更新: コメントで指摘されているように、これは C++ であるため、関数の暗黙的な宣言に「苦しむ」べきではありません。変。前処理されたコードを読むことをお勧めします。おそらくhtons()、何らかの理由で奇妙な動作をしているマクロです。

于 2012-04-25T14:56:15.023 に答える