c Сравнение предупреждений strptime между указателем и целым числом - PullRequest
1 голос
/ 04 мая 2011

При компиляции с gcc 4.4.3 в Ubuntu 10.04.2 x86_64 я получаю следующее предупреждение:

warning: comparison between pointer and integer

для этой строки:

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

Если изменить NULL на 0,предупреждение уходит.Но на странице man для 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 ]

3 голосов
/ 04 мая 2011

Согласно документации POSIX , strptime объявлено в <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.

2 голосов
/ 04 мая 2011

Полагаю, вы получаете это предупреждение, потому что strptime не объявлено.(Без объявления strptime по умолчанию возвращает int.) Как вы уже догадались, это, вероятно, связано с отсутствием #define _XOPEN_SOURCE.

Следующая программа не выдает предупреждений, используя "gcc"на Ubuntu 10.04.2 LTS.Так выглядит ваша программа?

#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;
}

EDIT Вы не должны определять __USE_XOPEN.Вы должны определить _XOPEN_SOURCE.На странице руководства Linux правильное использование:

#define _XOPEN_SOURCE
#include <time.h>
2 голосов
/ 04 мая 2011

[отредактировано после публикации полного блока включений]

Вы используете неправильный макрос выбора объектов и делаете это в неправильном месте.
#define __USE_XOPEN 1 работает только тогда, когда glibcделает это внутренне, а не когда вы это делаете.
#define _XOPEN_SOURCE - это то, что вы должны использовать, но это работает, только если вы поместите его перед всеми #include системными заголовками.

Кроме того, ваш код демонстрирует плохой стиль: явное сравнение с NULL (или 0) внутри if является неприятным запахом кода.Вы должны написать это так:

if (!strptime(...))

Также разумные люди могут не согласиться с этим, но я вообще не верю в использование NULL.В C 0 - это очень хорошая константа нулевого указателя, за исключением очень необычных условий - и при этих условиях NULL также не работает .(В C ++ все по-другому.)

0 голосов
/ 31 мая 2013

Simple.сравните его с 0. if strptime (date_time, "% d-% b-% y% T", & tm) == 0

...