最近维护一个古老代码的时候,在AS7里边编译的时候出现了不少错误,比如:
warning: comparison between pointer and integer, 这是代码 strptime(current_time, “%a%n%b%n%d%n%H:%M:%S%n%Y”, &tm) == NULL) 产生的
还有, warning: incompatible implicit declaration of built-in function ‘snprintf’, 这是类似 snprintf(path, sizeof(path), “%s/arc_%s”, archdir, com->cat) 的代码产生的
查了下,strptime的异常返回值确实是NULL, http://man7.org/linux/man-pages/man3/strptime.3.html
If strptime() fails to match all of the format string and therefore an error occurred, the function returns NULL.
一般来说, 类似的snprintf错误 添加 #include<stdlib.h>就好,但是这个古老代码里边已经有这个了
在代码的开头发现了这个东西
define _XOPEN_SOURCE
_XOPEN_SOURCE
Defining this macro causes header files to expose definitions as
follows:
o Defining with any value exposes definitions conforming to POSIX.1, POSIX.2, and XPG4.
o The value 500 or greater additionally exposes definitions for SUSv2 (UNIX 98).
o (Since glibc 2.2) The value 600 or greater additionally exposes definitions for SUSv3 (UNIX 03; i.e., the POSIX.1-2001 base specification plus the XSI extension) and C99 definitions.
o (Since glibc 2.10) The value 700 or greater additionally exposes definitions for SUSv4 (i.e., the POSIX.1-2008 base specification plus the XSI extension).
https://linux.cn/man7/feature_test_macros.7.html, 初略的说,大概是不同的值会影响某些函数和库的一些标准行为,而默认的_xopen_soure 不带参数会被认为是<500
#define _XOPEN_SOURCE /* or any value < 500 */
所以需要修正这个模式,添加一个标准即可,由于代码比较古老,修改为500和600都可以编译通过