16 c c++ c-preprocessor
是否有更人性化的方式来表示用C++或C编写的应用程序的源代码中的大数字?
例如2,345,879,444,641,如果我们想要一个程序返回我们要做的那个数字,那么就用C或C++中的数字来表示return 2345879444641.
但这不是真的可读.
例如,在PAWN(一种脚本语言)中,我可以做return 2_345_879_444_641甚至是return 2_34_58_79_44_46_41这两种语言都可以返回数字2,345,879,444,641.
对于人眼来说,这更具可读性.
这有C或C++的等价物吗?
Jer*_*fin 23
使用当前编译器(C++ 14或更高版本),您可以使用撇号,如:
auto a = 1'234'567;
Run Code Online (Sandbox Code Playgroud)
如果您仍然坚持使用C++ 11,则可以使用用户定义的文字来支持以下内容:int i = "1_000_000"_i.代码看起来像这样:
#include <iostream>
#include <string>
#include <cstdlib>
int operator "" _i (char const *in, size_t len) {
std::string input(in, len);
int pos;
while (std::string::npos != (pos=input.find_first_of("_,")))
input.erase(pos, 1);
return std::strtol(input.c_str(), NULL, 10);
}
int main() {
std::cout << "1_000_000_000"_i;
}
Run Code Online (Sandbox Code Playgroud)
正如我所写,它可以互换地支持下划线或逗号,因此您可以使用其中一个或两个,或两者兼而有之.例如,"1,000_000"结果为1000000.
当然,欧洲人可能更喜欢"." 而不是"," - 如果是这样,请随意修改,如你所愿.
Cat*_*lus 12
使用Boost.PP:
#define NUM(...) \
NUM_SEQ(BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__))
#define NUM_SEQ(seq) \
BOOST_PP_SEQ_FOLD_LEFT(NUM_FOLD, BOOST_PP_SEQ_HEAD(seq), BOOST_PP_SEQ_TAIL(seq))
#define NUM_FOLD(_, acc, x) \
BOOST_PP_CAT(acc, x)
Run Code Online (Sandbox Code Playgroud)
用法:
NUM(123, 456, 789) // Expands to 123456789
Run Code Online (Sandbox Code Playgroud)
演示.
另一种方法是制作UDL.留作练习(也因为它需要更多代码).
这是一个宏,可以在MSVC和GCC上进行测试.不依赖Boost ......
#define NUM(...) NUM_(__VA_ARGS__, , , , , , , , , , )
#define NUM_(...) NUM_MSVCHACK((__VA_ARGS__))
#define NUM_MSVCHACK(numlist_) NUM__ numlist_
#define NUM__(a1_, a2_, a3_, a4_, a5_, a6_, a7_, a8_, ...) a1_##a2_##a3_##a4_##a5_##a6_##a7_##a8_
Run Code Online (Sandbox Code Playgroud)
使用它像:
int y = NUM(1,2,3,4,5,6,7,8);
int x = NUM(100,460,694);
Run Code Online (Sandbox Code Playgroud)
生产:
int y = 12345678;
int x = 100460694;
Run Code Online (Sandbox Code Playgroud)
对于C++1y,您现在可以使用单引号 ( ') 作为数字分隔符。基于N3781:单引号作为数字分隔符,最终被接受。gcc和clang都支持此功能作为其C++1y实现的一部分。
所以下面的程序(请查看 clang 的实时情况):
#include <iostream>
int main(){
std::cout << 2'345'879'444'641 << std::endl ;
}
Run Code Online (Sandbox Code Playgroud)
将输出:
2345879444641