c strptime指针和整数之间的警告比较

时间:2011-05-03 20:22:39

标签: c strptime

在Ubuntu 10.04.2 x86_64上使用gcc 4.4.3进行编译我收到以下警告:

warning: comparison between pointer and integer

这一行:

if (strptime(date_time, "%d-%b-%y %T", &tm) == NULL) {

如果我将NULL更改为0,则警告消失。但是strptime的手册页声明它在出错时返回NULL。我在上一行添加了<time.h>#define __USE_XOPEN 1。我也试过#define _XOPEN_SOURCE

感谢您的时间。

修改

完整包括:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>

#define __USE_XOPEN 1 /* needed for strptime */
#include <time.h>

#include <arpa/inet.h>
#include <errno.h>

#include "recv.h"
#include "tcp.h"
#include "types.h"

修改

以下代码给出了相同的警告:

#define __USE_XOPEN 1 /* needed for strptime */
#include <time.h>

#include <stdio.h>

int main()
{
    struct tm tm;
    char date_time[] = "3-May-11 12:49:00";

    if (strptime(date_time, "%d-%b-%y %T", &tm) == NULL) {
        fprintf(stderr, "Error: strptime failed matching input\n");
    }

    return 0;
}

编辑编辑

但将其更改为_XOPEN_SOURCE有效!并将定义移动到程序的顶部修复了原始文件。

4 个答案:

答案 0 :(得分:3)

根据POSIX documentationstrptime中声明了<time.h>

你需要

#define _XOPEN_SOURCE
/* other headers, if needed, after the #define
#include <assert.h>
#include <ctype.h>
#include <stdio.h>
*/
#include <time.h>

在范围内拥有正确的原型。

如果没有原型,编译器会假定函数返回int

答案 1 :(得分:2)

[发布完整包含块后编辑]

您使用的是错误的功能选择宏,并且您在错误的位置执行此操作 #define __USE_XOPEN 1仅在glibc内部执行时才有效,而不是在执行时。{ #define _XOPEN_SOURCE是您应该使用的内容,但只有在所有 #include系统标头之前放置它才有效。

此外,您的代码显示不良样式:在if内显式比较NULL(或0)是一个糟糕的代码气味。你应该这样写:

if (!strptime(...))

另外,合理的人可以不同意这一点,但我完全不相信使用NULL。在C中,0是一个非常好的空指针常量,除非在非常不寻常的条件下 - 并且在这些条件下 NULL不能正常工作。 (C ++中的情况有所不同。)

答案 2 :(得分:2)

我认为你收到了警告,因为strptime未被声明。 (如果没有声明,strptime默认返回int。)正如您已经猜到的,这可能是由于缺少#define _XOPEN_SOURCE

以下程序在Ubuntu 10.04.2 LTS上使用“gcc”不会产生警告。这是你的程序的样子吗?

#define _XOPEN_SOURCE
#include <time.h>

int main() {
  struct tm tm;
  char date_time[] = "Monday morning";
  if (strptime(date_time, "%d-%b-%y %T", &tm) == NULL) {
  }
  return 0;
}

修改 您不能定义__USE_XOPEN。您必须定义_XOPEN_SOURCE。从linux手册页中,正确的用法是:

#define _XOPEN_SOURCE
#include <time.h>

答案 3 :(得分:0)

简单。将它与0进行比较。 如果strptime(date_time,“%d-%b-%y%T”,&amp; tm)== 0