powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / C++ [игнор отключен] [закрыт для гостей] / VS 2017
16 сообщений из 16, страница 1 из 1
VS 2017
    #39607343
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
https://msdn.microsoft.com/en-us/library/2029ea5f.aspx These functions are obsolete. Beginning in Visual Studio 2015, they are not available in the CRT. The secure versions of these functions, gets_s and _getws_s, are still available. For information on these alternative functions, see gets_s, _getws_s.
микрософт gets вообще удалил из компилятора,
или она таки доступна? Если скомпилировать не для CRT?
...
Рейтинг: 0 / 0
VS 2017
    #39607344
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
https://msdn.microsoft.com/ru-ru/library/2029ea5f.aspx Эти функции устарели. Начиная с Visual Studio 2015 они недоступны в CRT.
Безопасные версии этих функций, gets_s и _getws_s, по-прежнему доступны.
...
Рейтинг: 0 / 0
VS 2017
    #39607346
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Замени на gets_s()
...
Рейтинг: 0 / 0
VS 2017
    #39607845
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сенкс, хотя я не спрашивал что делать ))
--
принесли комп с со студией 2017.
В студии использование gets подсвечивается как ошибка и проект не компилируется.
Соответствующая #pragma якобы не помогает. Это со слов владельца студии, я не проверил.
В командной строке через cl.exe *.cpp все компилируется на ура.
Изучать свойства проекта для поиска параметров, чтобы компилировалось лень.
...
Рейтинг: 0 / 0
VS 2017
    #39607854
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gets() выкинули из стандарта
http://www.cplusplus.com/reference/cstdio/gets/?kw=gets The most recent revision of the C standard (2011) has definitively removed this function from its specification.
The function is deprecated in C++ (as of 2011 standard, which follows C99+TC3).

Посмотри в свойствах проекта: General - Platform toolset. Может там можно выбрать CRT для 2013 или старше. Я так понимаю они у тебя есть, раз cl.exe компилирует.
...
Рейтинг: 0 / 0
VS 2017
    #39607975
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ок.
...
Рейтинг: 0 / 0
VS 2017
    #39608276
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingiz,

дефайном через gets_s не пробовал протолкнуть?
...
Рейтинг: 0 / 0
VS 2017
    #39609037
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)tchingiz,

дефайном через gets_s не пробовал протолкнуть?
нет.
у меня компилятор 2010.
Владелец компилятора 2017 пытался мне рассказать, что gets удалена
из библиотеки студии 2017 вообще и с ней нельзя скомпилировать приложение.
Оказалось, что можно.
...
Рейтинг: 0 / 0
VS 2017
    #39609476
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingizОказалось, что можно.можно напрямую из CTR звать. Из CRT оно не так скоро пропадёт... А вообще это изврат какой-то... Зачем её было убирать из хедеров (как я понял)?
...
Рейтинг: 0 / 0
VS 2017
    #39609483
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Действительно, gets - единственная функция, которую выкинули из нового стандарта С, забив на обратную совместимость.
The gets() function does not perform bounds checking, therefore this function is extremely vulnerable to buffer-overflow attacks. It cannot be used safely (unless the program runs in an environment which restricts what can appear on stdin). For this reason, the function has been deprecated in the third corrigendum to the C99 standard and removed altogether in the C11 standard. fgets() and gets_s() are the recommended replacements.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
VS 2017
    #40026135
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMb
tchingizОказалось, что можно.
можно напрямую из CTR звать. Из CRT оно не так скоро пропадёт... А вообще это изврат какой-то... Зачем её было убирать из хедеров (как я понял)?

сишный текст компилирует левой задней ногой.

значит сама функция осталось. Ее прототип удалили из заголовков.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
#include <stdio.h>
extern "C" char * gets (char * buf); /// <----------------------
int main() {       
   char  buf[1000] = {0};
   gets(buf);
   printf ("\n your input: '%s'", buf);
}



попроверял на http://primat.org/index/0-143
включал опции g++11 и g++14
и на
g++ (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
Copyright (C) 2017



Для последних версий микрософта есть макрос

Код: plaintext
1.
 #define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
который делает то, что вы предлагали --
заменяет gets на gets_s
и все остальные вызовы функций, которые предекатед.

Макрос еще не проверил.
...
Рейтинг: 0 / 0
VS 2017
    #40026136
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingiz, макрос не заменяет, а просто разрешает компилировать небезопасные функции.
Добавь что он просит #define ... перед первым #include
...
Рейтинг: 0 / 0
VS 2017
    #40026258
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T

Добавь что он просит #define ... перед первым #include


+1 согласен

автор макрос не заменяет, а просто разрешает компилировать небезопасные функции.
ты меня не путай, я сам регулярно запутываюсь


сначала идет про предупрежденние и как с ним быть, игнорить например.

https://docs.microsoft.com/en-us/cpp/c-runtime-library/secure-template-overloads?view=msvc-160 The template overloads provide additional choices. If you define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES to 1, this enables template overloads of standard CRT functions that call the more secure variants automatically. If _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES is 1, then no changes to your code are necessary. Behind the scenes, the call to strcpy is changed to a call to strcpy_s with the size argument supplied automatically.
Но перегруженные шаблоны предоставляют дополнительный выбор.
Если определите _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES to 1, то
будет разрешена автоматическая перегрузка стандартных црт функций шаблонами, которые более безопасны. Установка блабла в 1 позволяет избегть изменений вашего кода.
Позади сцены (тышком-нышком) вызов strcpy заменяется на вызов strcpy_s с
правильным автоматически подставляемым размером.
...
Рейтинг: 0 / 0
VS 2017
    #40026353
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingizПозади сцены (тышком-нышком) вызов strcpy заменяется на вызов strcpy_s с
правильным автоматически подставляемым размером.

И какой размер она туда подставит при вызове?
Код: sql
1.
2.
char *a, *b;
strcpy(a, b);


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
VS 2017
    #40026356
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingiz
автор макрос не заменяет, а просто разрешает компилировать небезопасные функции.

ты меня не путай, я сам регулярно запутываюсь
Я перепутал с _CRT_SECURE_NO_WARNINGS

Этот действительно заменяет
https://docs.microsoft.com/ru-ru/cpp/c-runtime-library/secure-template-overloads?view=msvc-160 Если _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES имеет значение "1", никаких изменений в коде не требуется. Вызов функции strcpy в фоновом режиме заменяется вызовом функции strcpy_s с автоматической подстановкой аргумента размера.
Код: plaintext
1.
2.
3.
4.
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
// ...
char szBuf[10];
strcpy(szBuf, "test"); // ==> strcpy_s(szBuf, 10, "test")


...

Эти перегрузки шаблонов работают только для статических массивов. Динамически выделенные буферы требуют дополнительных изменений исходного кода. В приведенных выше примерах:
Код: plaintext
1.
2.
3.
4.
5.
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
// ...
char *szBuf = (char*)malloc(10);
strcpy(szBuf, "test"); // still deprecated; change it to
                       // strcpy_s(szBuf, 10, "test");
...
Рейтинг: 0 / 0
VS 2017
    #40027996
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в gcc проблемой с gets якобы можно управлять опцией
-std=c++11
-std=c++98

но на моем проверить не удалось
Код: plaintext
1.
2.
3.
4.
gcc (GCC) 9.3.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
мой всегда все компилирует и не строит козней.


микрософту до лампочки стандарт до 11 года (то есть, отменить трудности с gets легким способом нельзя), а опция похожая есть

https://docs.microsoft.com/en-us/cpp/build/reference/std-specify-language-standard-version?view=msvc-160 Enable supported C and C++ language features from the specified version of the C or C++ language standard.
Syntax

/std:c++14
/std:c++17
/std:c++latest
/std:c11
/std:c17
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / VS 2017
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]