Dev C++ strtok_s throws Назначение [Warning] делает указатель из целого числа без приведения

У меня есть следующая программа:

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

int main(int argc, char *argv[]) 
{
   char *tp = NULL, *cp = NULL, *next_token = NULL;
   char TokenListe[] = "Hello,I Am,1";

   tp = strtok_s(TokenListe, ", ", &next_token);

   printf(tp);
   return 0;
}

Когда я компилирую его в Visual Studio 2015, он компилируется без предупреждения. Но когда я компилирую его с Dev C++ 5.11, я получаю следующее предупреждение в строке 10:

Назначение [Предупреждение] делает указатель из целого числа без приведения

Есть ли решение, чтобы исправить это предупреждение?

3 ответа

Решение

Начиная с C11, strtok_s теперь является стандартом C, частью необязательного "интерфейса проверки границ" (Приложение K). Компиляторы не должны поддерживать это.

Но если они это сделают, формат будет таким (C11 K.3.7.3.1):

#define __STDC_WANT_LIB_EXT1__ 1
#include <string.h>

char *strtok_s(char * restrict s1,
               rsize_t * restrict s1max,
               const char * restrict s2,
               char ** restrict ptr);

Любой другой формат является нестандартным мусором и не должен использоваться, включая Microsoft strtok_s.

Dev C++ больше не поддерживается и поэтому содержит только очень старую версию gcc. Он не поддерживает C11, но, насколько мне известно, ни одна более новая версия библиотек gcc + пока не поддерживает интерфейс проверки границ C11. Visual Studio - это несоответствующий компилятор, и его нельзя использовать для компиляции стандарта C. Как правило, я бы посоветовал не использовать ни один из этих компиляторов, но обновить его до новой версии gcc (например, Codeblocks с Mingw).

Резюме: strtok_s не могут быть использованы разумным образом. использование strtok вместо. Просто убедитесь, что все задействованные буферы достаточно велики и не могут быть переполнены. В случае многопоточной программы, просто не используйте strtok совсем.

Если в Dev C++ нет нестандартного strtok_s, в C он будет неявно объявлен и предполагается, что он возвращает целое число.

Примечание: strtok_s входит в стандарт, но является "необязательным расширением", согласно (мой бесплатный черновик) стандарта C11.

Вы должны также включить другие предупреждения, такие как предупреждение для неявных объявлений функций.

Если в Dev C++ есть реализация strtok_s и ссылки на нее, объявление ее может работать. Но лучший вариант - найти правильный заголовочный файл или флаги компилятора, чтобы объявить его, если такие параметры существуют. Обратитесь к документации.

Но обратите внимание, как заметил Майкл Уолц, что strtok_s в стандарте C11 и strtok_s от Microsoft отличаются и не имеют одинаковых параметров! Я не знаю, какую версию Dev C++ реализует.

Основываясь на ответе Thomas Padron-McCarthy, я мог решить мою проблему с объявлением функции strtok_s в моем заголовочном файле.

extern char* strtok_s(char*, char*, char**);
Другие вопросы по тегам