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**);