17 c++ portability gcc
我偶尔会在我的开源C++库中使用64位算术.我发现这long long
很符合我的目的.甚至一些10岁的solaris盒也可以编译它.它的工作原理也没有在Windows上使用#defines.
现在问题是我收到用户的投诉,因为他们使用GCC设置编译,而GCC坚持发出long long
不属于C++标准的警告.这可能是正确的,但我对C++标准本身并不太感兴趣,我只是希望我的代码尽可能多地使用编译器.
所以我的问题是双重的:
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上.
您可以使用 使警告静音-Wno-long-long
(确保它出现在 后面-pedantic
)。C99 需要 64 位整数,我认为 C++0x 也需要,所以现在没有它们的编译器越来越少。
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
.
归档时间: |
|
查看次数: |
9246 次 |
最近记录: |