如何进行便携式64位运算,无需编译警告

17 c++ portability gcc

我偶尔会在我的开源C++库中使用64位算术.我发现这long long很符合我的目的.甚至一些10岁的solaris盒也可以编译它.它的工作原理也没有在Windows上使用#defines.

现在问题是我收到用户的投诉,因为他们使用GCC设置编译,而GCC坚持发出long long不属于C++标准的警告.这可能是正确的,但我对C++标准本身并不太感兴趣,我只是希望我的代码尽可能多地使用编译器.

所以我的问题是双重的:

  • 任何人都可以命名不支持64位长的实际C++编译器吗?
  • 有没有办法使GCC编译64位算术(在32位平台上)没有编译器警告?(stdint.h没有帮助,因为它也取决于long long)

PS

如果有长平台变为128位或更大的平台,这很有趣,但对我来说不是问题.

Ste*_*sop 16

当您的库作为源提供时,一个选项是提供"移植"标头,用户有责任提供64位类型(您可以指定名称).然后,他们自然有责任处理任何编译器警告他们选择的类型引起的,要么避开它们,要么压制它们,要么忽略它们.

我想这就是你所谓的"乱搞#defines",但我认为它没有太大的错误.您可以提供一个long long直接使用的默认版本,它可以在您已有10年历史的Solaris盒子上以及Windows上运行,因此大多数用户永远不需要靠近库中用户可配置的部分.

然后对于迂腐的用户,您可以提供GCC的版本,其中包括<sys/types.h>和使用int64_t而不是long long.这不会给我带来任何警告g++ -pedantic.你甚至可以在默认版本中通过识别GCC来做到这一点,GCC肯定会搞乱#defines,但对于多平台产品来说再也不是这样.

如果你的库也作为某些平台的二进制文件提供,那么当然你必须决定64位类型是什么.如果它也出现在库接口(以及头文件)中,那么您只需选择一个不会引发任何合理编译器选项警告的文件.我认为这-pedantic是一个合理的编译器选项,显然你的用户也是如此,所以再次int64_t在GCC上.


Cli*_*ord 13

在GCC中使用-Wno-long-long编译器选项来禁止该特定警告.

您也可以使用-std=C++0x,但可能会进一步降低可移植性.


zwo*_*wol 5

您可以使用 使警告静音-Wno-long-long(确保它出现在 后面-pedantic)。C99 需要 64 位整数,我认为 C++0x 也需要,所以现在没有它们的编译器越来越少。


Mar*_*som 5

如果您无法控制传递给gcc的开关,则可以使用来关闭警告#pragma

http://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html


Voi*_*oid 5

You can also suppress the warning using gcc's "__extension__" feature, e.g.:

// No '-pedantic' warning/error.
__extension__ long long foo = 2;

// Exhibits '-pedantic' warning/error.
long long bar = 3
Run Code Online (Sandbox Code Playgroud)

and the compile:

$ g++ -pedantic -fsyntax-only foo.cpp
foo.cpp:5: error: ISO C++ 1998 does not support 'long long'
Run Code Online (Sandbox Code Playgroud)

请注意,只有最后一次使用long long触发了-pedantic错误,因为没有__extension__预先设置.无论如何,我会选择@Steve Jessop建议使用int64_t.