C标准是否定义通用基数?strtol的十进制基数10有无标准定义?
C标准中是否定义了通用基数常量?
好问题!硬写魔法数10确实既不美观也容易埋下维护隐患,我完全理解你想找标准定义常量的想法。
直接给结论:C标准本身并没有为十进制(或者二进制、十六进制这类通用基数)定义预编译宏或常量。翻遍C标准库的头文件(比如<stdlib.h>这类包含strtol的头),你都找不到类似BASE_10、DECIMAL_BASE这类官方定义的符号。
至于为什么strtol这类函数要求手动传入基数?因为它们的设计目标是支持任意合法基数(范围是2到36,传0还能自动根据字符串前缀推断基数),并没有把十进制作为特殊绑定的默认值,所以标准也就没有专门为十进制定义常量。
不过解决方案很简单——你完全可以自己在代码里定义这类可读性强的常量:
#define BASE_DECIMAL 10 #define BASE_BINARY 2 #define BASE_HEX 16
之后调用strtol时就可以写成:
long num = strtol(input_str, NULL, BASE_DECIMAL);
这样既避免了魔法数的问题,代码可读性也大幅提升,而且完全是跨平台的标准写法。
顺带提一句:有些编译器或平台的非标准头文件里可能会有类似的自定义常量,但这些都是厂商特有的,没法保证在其他环境下能用,所以自己定义才是最稳妥的做法。
内容的提问来源于stack exchange,提问作者Jonathan Mee
相关产品推荐
相关产品推荐

