C4996 c ошибка как исправить

Ошибка C4996 C++ Решение и ответ на вопрос 1364800

Gusev

0 / 0 / 0

Регистрация: 04.12.2014

Сообщений: 10

1

29.01.2015, 21:33. Показов 32384. Ответов 15

Метки нет (Все метки)


Здравствуйте, у меня показывать ошибку C4996: ‘fopen’. помогите исправить.
Вот код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include "stdafx.h"
#include <iostream>
 
const int M = 50; //максмальное количество строк
const int N = 50; //максимальное количество столбцов
 
int main(int argc, char** argv) {
 
    setlocale(0, "rus"); //установка русскоязычной локации
 
    int m, n, k, sum, msum; //описываем переменные
    int a[M][N]; //описываем двумерный массив
    char c;
 
    FILE * file = fopen("test.txt", "r"); //объявляем файловую переменную, связываем с файлом и открываем для чтения
 
    m = 0; //инициализируем переменны
    n = 0;
    while (fscanf(file, "%i%c", &a[m][n], &c) != EOF) //читаем данные пока не конец файла
    {
 
        if (c == 'n') //если конец строки
        {
            m++; //переходим к следующей строке
            n = 0;
        }
        else
            n++; //переходим к следующему столбцу
    }
    m++;
    fclose(file); //закрываем файл
 
    for (int i = 0; i < m; i++) //проход по строкам
    {
        for (int j = 0; j < n; j++) //проход по столбцам
            printf("%4i", a[i][j]); //вывод на экран
        printf("n"); //переход на новую строку
    }
 
    msum = 10000; //начальная минимальня сумма
 
    for (int i = 1; i < m; i += 2) //проход по строкам
    {
        sum = 0; //обнуляем сумму
        for (int j = 0; j < n; j++) //проход по столбцам
            if (a[i][j] % 2 != 0) //проверка на чётность
                sum += a[i][j]; //накопление суммы
        printf("Сумма нечётных элементов в %i-й строке: %in", i + 1, sum); //переход на новую строку
        if (sum < msum)
        {
            msum = sum; //запоминаем текущую сумму
            k = i + 1; //запоминаем текущую строку
        }
    }
    printf("Минимальная сумма нечётных элементов в %i-й строке. n", k);
    return 0;
}

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



zss

Модератор

Эксперт С++

12640 / 10134 / 6102

Регистрация: 18.12.2011

Сообщений: 27,170

29.01.2015, 21:39

2

C++
1
#pragma warning(disable:4996)



2



7275 / 6220 / 2833

Регистрация: 14.04.2014

Сообщений: 26,871

29.01.2015, 21:41

3

<cstdio> подключи.



0



1499 / 1145 / 165

Регистрация: 05.12.2011

Сообщений: 2,279

29.01.2015, 21:41

4

вообще нужно полный текст ошибок/предупреждений приводить.
а перед этим прочитать. там все понятно написано что произошло и как с этим бороться
(по крайней мере для C4996)



0



0 / 0 / 0

Регистрация: 04.12.2014

Сообщений: 10

29.01.2015, 21:43

 [ТС]

5

#pragma warning(disable:4996) и <cstdio> не помогли, как и #define _CRT_SECURE_NO_WARNINGS. а если fopen заменить на fopen_s, то пишет, что fopen_s не может принимать два значения.

Добавлено через 1 минуту
полный текст ошибки: 1>c:usersниколайdocumentsvisual studio 2013projectsconsoleapplication8consoleapplicati on8consoleapplication8.cpp(18): error C4996: ‘fopen’: This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:program files (x86)microsoft visual studio 12.0vcincludestdio.h(211) : see declaration of ‘fopen’



0



1499 / 1145 / 165

Регистрация: 05.12.2011

Сообщений: 2,279

29.01.2015, 21:43

6

наверно потому, что оно принимает три:
https://msdn.microsoft.com/ru-… h6ee9.aspx

_CRT_SECURE_NO_WARNINGS — вот это вы где задефайнили? надо чтобы перед инклудом это было.
в вашем случае наверно это прям перед stdafx



0



7275 / 6220 / 2833

Регистрация: 14.04.2014

Сообщений: 26,871

29.01.2015, 21:45

7

В свойствах проекта уровень предупреждений поменяй.



1



0 / 0 / 0

Регистрация: 04.12.2014

Сообщений: 10

29.01.2015, 21:47

 [ТС]

8

DU2, так я и перед инклудами писал, выдает еще одну ошибку warning C4603: ‘_CRT_SECURE_NO_WARNINGS’ : macro is not defined or definition is different after precompiled header use
Add macro to precompiled header instead of defining here



0



DU

1499 / 1145 / 165

Регистрация: 05.12.2011

Сообщений: 2,279

29.01.2015, 21:49

9

C++
1
2
3
4
5
#define _CRT_SECURE_NO_WARNINGS
#include "stdafx.h"
#include <iostream>
 
...

так? если так и все равно проблемы — тогда хз.
пробуйте в свойствах проекта выставить:
Project->PRoperties->C/C++->Preprocessor->Preprocessor Definitions
туда этот макрос напишите.



1



0 / 0 / 0

Регистрация: 04.12.2014

Сообщений: 10

29.01.2015, 22:06

 [ТС]

10

nmcf, а как это сделать? у меня английская версия, плохо понимаю.

Добавлено через 15 минут
В общем в свойствах проекта прописал макрос — не помогло. Поменял уровень предупреждений — не помогло



0



7275 / 6220 / 2833

Регистрация: 14.04.2014

Сообщений: 26,871

29.01.2015, 22:26

11

В разделе C/C++ — обрабатывать предупреждения как ошибки — Нет.



0



1499 / 1145 / 165

Регистрация: 05.12.2011

Сообщений: 2,279

29.01.2015, 22:38

12

какая у вас студия?
запакуйте все проектные файлы и сюда выложите чтоли.



0



0 / 0 / 0

Регистрация: 04.12.2014

Сообщений: 10

29.01.2015, 22:46

 [ТС]

13



0



1499 / 1145 / 165

Регистрация: 05.12.2011

Сообщений: 2,279

29.01.2015, 23:01

14

Лучший ответ Сообщение было отмечено Gusev как решение

Решение

В свойствах:
Project->Properties->Configuration Properties->C/C++->General->SDL checks
поставте в No
это превратит ошибку в ворнинг, которая отключается если сильно надо одним из ранее описанных способов:
макросом в свойствах или макросом в коде.



3



0 / 0 / 0

Регистрация: 04.12.2014

Сообщений: 10

29.01.2015, 23:19

 [ТС]

15

а теперь выводит вот это http://rghost.ru/8J7k4jhT5

Добавлено через 3 минуты
похоже, что это у меня в VS проблема.
DU2, спасибо.



0



1499 / 1145 / 165

Регистрация: 05.12.2011

Сообщений: 2,279

30.01.2015, 00:03

16

это у вас рантайм ошибка. глюк в коде, а не в студии.
осваивайте студийных дебаггер.
начать можно отсюда:
https://www.cyberforum.ru/cpp-… 62479.html



0



Содержание

  1. Compiler Warning (level 3) C4996
  2. Remarks
  3. Turn off the warning
  4. Turn off the warning for a specific line of code
  5. Turn off the warning within a file
  6. Turn off the warning in command-line builds
  7. Turn off the warning for a project in Visual Studio
  8. Disable the warning using preprocessor macros
  9. POSIX function names
  10. Unsafe CRT Library functions
  11. Unsafe Standard Library functions
  12. Checked iterators enabled
  13. Unsafe MFC or ATL code
  14. Obsolete CRT functions and variables
  15. Marshaling errors in CLR code
  16. Example: User-defined deprecated function
  17. Предупреждение компилятора (уровень 3) C4996
  18. Комментарии
  19. Отключение предупреждения
  20. Отключение предупреждения для определенной строки кода
  21. Отключение предупреждения в файле
  22. Отключение предупреждения в сборках командной строки
  23. Отключение предупреждения для проекта в Visual Studio
  24. Отключение предупреждения с помощью макросов препроцессора
  25. Имена функций POSIX
  26. Небезопасные функции библиотеки CRT
  27. Небезопасные функции стандартной библиотеки
  28. Проверенные итераторы включены
  29. Небезопасный код MFC или ATL
  30. Устаревшие функции и переменные CRT
  31. Маршалинг ошибок в коде СРЕДЫ CLR
  32. Пример: определяемая пользователем нерекомендуемая функция

Compiler Warning (level 3) C4996

Your code uses a function, class member, variable, or typedef that’s marked deprecated. Symbols are deprecated by using a __declspec(deprecated) modifier, or the C++14 [[deprecated]] attribute. The actual C4996 warning message is specified by the deprecated modifier or attribute of the declaration.

This warning is always a deliberate message from the author of the header file that declares the symbol. Don’t use the deprecated symbol without understanding the consequences.

Many functions, member functions, function templates, and global variables in Visual Studio libraries are deprecated. Some, such as POSIX and Microsoft-specific functions, are deprecated because they now have a different preferred name. Some C runtime library functions are deprecated because they’re insecure and have a more secure variant. Others are deprecated because they’re obsolete. The deprecation messages usually include a suggested replacement for the deprecated function or global variable.

The /sdl (Enable Additional Security Checks) compiler option elevates this warning to an error.

Turn off the warning

To fix a C4996 issue, we usually recommend you change your code. Use the suggested functions and global variables instead. If you need to use the existing functions or variables for portability reasons, you can turn off the warning.

Turn off the warning for a specific line of code

To turn off the warning for a specific line of code, use the warning pragma, #pragma warning(suppress : 4996) .

Turn off the warning within a file

To turn off the warning within a file for everything that follows, use the warning pragma, #pragma warning(disable : 4996) .

Turn off the warning in command-line builds

To turn off the warning globally in command-line builds, use the /wd4996 command-line option.

Turn off the warning for a project in Visual Studio

To turn off the warning for an entire project in the Visual Studio IDE:

Open the Property Pages dialog for your project. For information on how to use the Property Pages dialog, see Property Pages.

Select the Configuration Properties > C/C++ > Advanced property page.

Edit the Disable Specific Warnings property to add 4996 . Choose OK to apply your changes.

Disable the warning using preprocessor macros

You can also use preprocessor macros to turn off certain specific classes of deprecation warnings used in the libraries. These macros are described below.

To define a preprocessor macro in Visual Studio:

Open the Property Pages dialog for your project. For information on how to use the Property Pages dialog, see Property Pages.

Expand Configuration Properties > C/C++ > Preprocessor.

In the Preprocessor Definitions property, add the macro name. Choose OK to save, and then rebuild your project.

To define a macro only in specific source files, add a line such as #define EXAMPLE_MACRO_NAME before any line that includes a header file.

Here are some of the common sources of C4996 warnings and errors:

POSIX function names

The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name: new-name. See online help for details.

Microsoft renamed some POSIX and Microsoft-specific library functions in the CRT to conform with C99 and C++03 constraints on reserved and global implementation-defined names. Only the names are deprecated, not the functions themselves. In most cases, a leading underscore was added to the function name to create a conforming name. The compiler issues a deprecation warning for the original function name, and suggests the preferred name.

To fix this issue, we usually recommend you change your code to use the suggested function names instead. However, the updated names are Microsoft-specific. If you need to use the existing function names for portability reasons, you can turn off these warnings. The functions are still available in the library under their original names.

To turn off deprecation warnings for these functions, define the preprocessor macro _CRT_NONSTDC_NO_WARNINGS . You can define this macro at the command line by including the option /D_CRT_NONSTDC_NO_WARNINGS .

Unsafe CRT Library functions

This function or variable may be unsafe. Consider using safe-version instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

Microsoft deprecated some CRT and C++ Standard Library functions and globals because more secure versions are available. Most of the deprecated functions allow unchecked read or write access to buffers. Their misuse can lead to serious security issues. The compiler issues a deprecation warning for these functions, and suggests the preferred function.

To fix this issue, we recommend you use the function or variable safe-version instead. Sometimes you can’t, for portability or backwards compatibility reasons. Carefully verify it’s not possible for a buffer overwrite or overread to occur in your code. Then, you can turn off the warning.

To turn off deprecation warnings for these functions in the CRT, define _CRT_SECURE_NO_WARNINGS .

To turn off warnings about deprecated global variables, define _CRT_SECURE_NO_WARNINGS_GLOBALS .

For more information about these deprecated functions and globals, see Security Features in the CRT and Safe Libraries: C++ Standard Library.

Unsafe Standard Library functions

‘std:: function_name ::_Unchecked_iterators::_Deprecate’ Call to std:: function_name with parameters that may be unsafe — this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ ‘Checked Iterators’

In Visual Studio 2015, this warning appears in debug builds because certain C++ Standard Library function templates don’t check parameters for correctness. Often it’s because not enough information is available to the function to check container bounds. Or, because iterators may be used incorrectly with the function. This warning helps you identify these functions, because they may be a source of serious security holes in your program. For more information, see Checked iterators.

For example, this warning appears in Debug mode if you pass an element pointer to std::copy , instead of a plain array. To fix this issue, use an appropriately declared array, so the library can check the array extents and do bounds checking.

Several standard library algorithms were updated to have «dual range» versions in C++14. If you use the dual range versions, the second range provides the necessary bounds checking:

This example demonstrates several more ways the standard library may be used to check iterator usage, and when unchecked usage may be dangerous:

If you’ve verified that your code can’t have a buffer-overrun error, you can turn off this warning. To turn off warnings for these functions, define _SCL_SECURE_NO_WARNINGS .

Checked iterators enabled

C4996 can also occur if you don’t use a checked iterator when _ITERATOR_DEBUG_LEVEL is defined as 1 or 2. It’s set to 2 by default for debug mode builds, and to 0 for retail builds. For more information, see Checked iterators.

Unsafe MFC or ATL code

C4996 can occur if you use MFC or ATL functions that were deprecated for security reasons.

To fix this issue, we strongly recommend you change your code to use updated functions instead.

For information on how to suppress these warnings, see _AFX_SECURE_NO_WARNINGS .

Obsolete CRT functions and variables

This function or variable has been superseded by newer library or operating system functionality. Consider using new_item instead. See online help for details.

Some library functions and global variables are deprecated as obsolete. These functions and variables may be removed in a future version of the library. The compiler issues a deprecation warning for these items, and suggests the preferred alternative.

To fix this issue, we recommend you change your code to use the suggested function or variable.

To turn off deprecation warnings for these items, define _CRT_OBSOLETE_NO_WARNINGS . For more information, see the documentation for the deprecated function or variable.

Marshaling errors in CLR code

C4996 can also occur when you use the CLR marshaling library. In this case, C4996 is an error, not a warning. The error occurs when you use marshal_as to convert between two data types that require a marshal_context Class. You can also receive this error when the marshaling library doesn’t support a conversion. For more information about the marshaling library, see Overview of marshaling in C++.

This example generates C4996 because the marshaling library requires a context to convert from a System::String to a const char * .

Example: User-defined deprecated function

You can use the deprecated attribute in your own code to warn callers when you no longer recommend use of certain functions. In this example, C4996 is generated in two places: One for the line the deprecated function is declared on, and one for the line where the function is used.

Источник

Предупреждение компилятора (уровень 3) C4996

Код использует функцию, член класса, переменную или определение типа, помеченную как нерекомендуемую. Символы устарели с помощью __declspec(deprecated) модификатора или атрибута C++14 [[deprecated]] . Фактическое предупреждающее сообщение C4996 задается модификатором или атрибутом deprecated объявления.

Это предупреждение всегда является преднамеренным сообщением автора файла заголовка, объявляющего символ. Не используйте устаревший символ без понимания последствий.

Комментарии

Многие функции, функции-члены, шаблоны функций и глобальные переменные в библиотеках Visual Studio устарели. Некоторые функции, такие как POSIX и функции Майкрософт, устарели, так как теперь они имеют другое предпочтительное имя. Некоторые функции библиотеки среды выполнения C устарели, так как они небезопасны и имеют более безопасный вариант. Другие нерекомендуемые, так как они устарели. Сообщения об устаревании обычно включают предполагаемую замену устаревшей функции или глобальной переменной.

Отключение предупреждения

Чтобы устранить проблему C4996, обычно рекомендуется изменить код. Вместо этого используйте предлагаемые функции и глобальные переменные. Если вам нужно использовать существующие функции или переменные по соображениям переносимости, можно отключить предупреждение.

Отключение предупреждения для определенной строки кода

Чтобы отключить предупреждение для определенной строки кода, используйте директиву warning pragma. #pragma warning(suppress : 4996)

Отключение предупреждения в файле

Чтобы отключить предупреждение в файле для всего следующего, используйте директиву pragma #pragma warning(disable : 4996) предупреждения.

Отключение предупреждения в сборках командной строки

Чтобы отключить предупреждение глобально в сборках командной строки, используйте параметр командной /wd4996 строки.

Отключение предупреждения для проекта в Visual Studio

Чтобы отключить предупреждение для всего проекта в интегрированной среде разработки Visual Studio, выполните следующие действия.

Откройте диалоговое окно «Страницы свойств » для проекта. Сведения об использовании диалогового окна «Страницы свойств» см. в разделе «Страницы свойств».

Выберите страницу свойств> конфигурацииC/C++>Advanced.

Измените свойство Disable Specific Warnings для добавления 4996 . Нажмите кнопку «ОК» , чтобы применить изменения.

Отключение предупреждения с помощью макросов препроцессора

Вы также можете использовать макросы препроцессора для отключения определенных классов предупреждений об устаревании, используемых в библиотеках. Эти макросы описаны ниже.

Чтобы определить макрос препроцессора в Visual Studio, выполните следующие действия.

Откройте диалоговое окно «Страницы свойств » для проекта. Сведения об использовании диалогового окна «Страницы свойств» см. в разделе «Страницы свойств».

Разверните свойства > конфигурации препроцессора C/C++>.

В свойстве «Определения препроцессора» добавьте имя макроса. Нажмите кнопку ОК для сохранения изменений, а затем выполните повторную сборку проекта.

Чтобы определить макрос только в определенных исходных файлах, добавьте строку, #define EXAMPLE_MACRO_NAME например перед любой строкой, включающей файл заголовка.

Ниже приведены некоторые распространенные источники предупреждений и ошибок C4996:

Имена функций POSIX

The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name: new-name. See online help for details.

Корпорация Майкрософт переименовывает некоторые функции БИБЛИОТЕК POSIX и Microsoft в CRT в соответствии с ограничениями C99 и C++03 для зарезервированных и глобальных имен, определенных реализацией. Не рекомендуется использовать только имена, а не сами функции. В большинстве случаев в имя функции был добавлен символ подчеркивания, чтобы создать соответствующее имя. Компилятор выдает предупреждение об устаревании для исходного имени функции и предлагает предпочтительное имя.

Чтобы устранить эту проблему, мы обычно рекомендуем изменить код, чтобы использовать предлагаемые имена функций. Однако обновленные имена зависят от корпорации Майкрософт. Если вам нужно использовать существующие имена функций по причинам переносимости, эти предупреждения можно отключить. Функции по-прежнему доступны в библиотеке под их исходными именами.

Чтобы отключить предупреждения об устаревании для этих функций, определите макрос _CRT_NONSTDC_NO_WARNINGS препроцессора. Этот макрос можно определить в командной строке, включив параметр /D_CRT_NONSTDC_NO_WARNINGS .

Небезопасные функции библиотеки CRT

This function or variable may be unsafe. Consider using safe-version instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

Корпорация Майкрософт не рекомендует использовать некоторые функции стандартной библиотеки CRT и C++, так как доступны более безопасные версии. Большинство устаревших функций позволяют отменить доступ на чтение или запись к буферам. Их неправильное использование может привести к серьезным проблемам безопасности. Компилятор выдает предупреждение об устаревании для этих функций и предлагает предпочтительную функцию.

Чтобы устранить эту проблему, рекомендуется использовать вместо нее функцию или переменную safe-version . Иногда невозможно, по соображениям переносимости или обратной совместимости. Тщательно убедитесь, что в коде невозможно перезаписать или перечитать буфер. Затем можно отключить предупреждение.

Чтобы отключить предупреждения об устаревании для этих функций в CRT, определите _CRT_SECURE_NO_WARNINGS .

Чтобы отключить предупреждения о нерекомендуемых глобальных переменных, определите _CRT_SECURE_NO_WARNINGS_GLOBALS .

Дополнительные сведения об этих устаревших функциях и глобальных функциях см. в разделе «Функции безопасности» в CRT и безопасных библиотеках: стандартная библиотека C++.

Небезопасные функции стандартной библиотеки

‘std:: function_name ::_Unchecked_iterators::_Deprecate’ Call to std:: function_name with parameters that may be unsafe — this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ ‘Checked Iterators’

В Visual Studio 2015 это предупреждение отображается в отладочных сборках, так как некоторые шаблоны функций стандартной библиотеки C++ не проверяют правильность параметров. Часто это связано с тем, что функции недостаточно информации для проверки границ контейнера. Или, поскольку итераторы могут использоваться неправильно с функцией. Это предупреждение помогает определить эти функции, так как они могут быть источником серьезных дыр в вашей программе. Дополнительные сведения см. в разделе «Проверенные итераторы».

Например, это предупреждение отображается в режиме отладки при передаче указателя std::copy на элемент вместо обычного массива. Чтобы устранить эту проблему, используйте соответствующий объявленный массив, чтобы библиотека может проверить экстенты массива и выполнить проверку границ.

В C++14 были обновлены несколько стандартных алгоритмов библиотеки с версиями «двойного диапазона». При использовании версий двойного диапазона второй диапазон обеспечивает необходимую проверку границ:

В этом примере показано несколько других способов использования стандартной библиотеки для проверки использования итератора, а также если флажок использования может быть опасным:

Если вы убедились, что код не может иметь ошибку переполнения буфера, вы можете отключить это предупреждение. Чтобы отключить предупреждения для этих функций, определите _SCL_SECURE_NO_WARNINGS .

Проверенные итераторы включены

C4996 также может возникнуть, если вы не используете проверяемый итератор, если _ITERATOR_DEBUG_LEVEL он определен как 1 или 2. По умолчанию для сборок в режиме отладки установлено значение 2, а для розничных сборок — значение 0. Дополнительные сведения см. в разделе «Проверенные итераторы».

Небезопасный код MFC или ATL

C4996 может возникнуть, если вы используете функции MFC или ATL, которые были нерекомендуемые по соображениям безопасности.

Чтобы устранить эту проблему, настоятельно рекомендуется изменить код для использования обновленных функций.

Сведения о том, как отключить эти предупреждения, см. в разделе _AFX_SECURE_NO_WARNINGS .

Устаревшие функции и переменные CRT

This function or variable has been superseded by newer library or operating system functionality. Consider using new_item instead. See online help for details.

Некоторые функции и глобальные переменные библиотеки устарели. Эти функции и переменные могут быть удалены в будущей версии библиотеки. Компилятор выдает предупреждение об устаревании для этих элементов и предлагает предпочтительную альтернативу.

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

Чтобы отключить предупреждения об устаревании для этих элементов, определите _CRT_OBSOLETE_NO_WARNINGS . Дополнительные сведения см. в документации по устаревшей функции или переменной.

Маршалинг ошибок в коде СРЕДЫ CLR

C4996 также может возникать при использовании библиотеки маршалинга CLR. В этом случае C4996 является ошибкой, а не предупреждением. Эта ошибка возникает при marshal_as преобразовании между двумя типами данных, которым требуется marshal_context класс. Эту ошибку также можно получить, если библиотека маршалинга не поддерживает преобразование. Дополнительные сведения о библиотеке маршалинга см. в обзоре маршалинга в C++.

В этом примере возникает ошибка C4996, так как для библиотеки маршалинга требуется контекст для преобразования из a System::String в . const char *

Пример: определяемая пользователем нерекомендуемая функция

Атрибут можно использовать в собственном коде deprecated , чтобы предупреждать вызывающих объектов, если вы больше не рекомендуете использовать определенные функции. В этом примере C4996 создается в двух местах: одна для строки, в которой объявлена нерекомендуемая функция, и одна для строки, в которой используется функция.

Источник

In previous versions of Visual Studio using functions like _sleep or strncpy just outputs a warning. In the latest version, it’s suddenly an error:

unexpected error

error C4996: ‘_sleep’: This function or variable has been superseded
by newer library or operating system functionality. Consider using
Sleep instead. See online help for details.

I know I can disable it by adding #pragma warning(disable: 4996) in the beginning of the code, but it’s extremely annoying that VS is trying to force me to use other functions. Is there any way to disable this behavior?

Before you ask, «Treat Warnings As Errors» is disabled, and it errors even if I turn off all warnings!

anastaciu's user avatar

anastaciu

23.1k7 gold badges27 silver badges48 bronze badges

asked Dec 7, 2013 at 23:39

Nikolai's user avatar

3

Apparently new projects enable «SDK check» by default now, which treats these warnings as errors. To disable it, go to project properties -> Configuration Properties -> C/C++ -> General -> SDL checks -> No.

answered Dec 7, 2013 at 23:45

Nikolai's user avatar

NikolaiNikolai

2,9733 gold badges24 silver badges33 bronze badges

2

enter at the beginning of the program:

#pragma warning(disable : 4996)

and that’s it.

answered Feb 27, 2018 at 19:16

ניתאי דרעי's user avatar

ניתאי דרעיניתאי דרעי

1632 silver badges9 bronze badges

1

You can also disable specific warning numbers in C/C++ > Advanced > Disable Specific Warnings.

answered Jun 17, 2014 at 15:57

Peter Tseng's user avatar

Peter TsengPeter Tseng

13.3k3 gold badges65 silver badges57 bronze badges

Just to add to this, _CRT_NONSTDC_NO_DEPRECATE worked for me in VS2019. _CRT_SECURE_NO_WARNINGS alone did not clear this for me (I have both defined).

Similar to the other answers, this may be added by right-clicking the project in Solution Explorer, Then going to Properties->Configuration Properties->C/C++->Preprocessor->Preprocessor Definitions->Edit… then adding the line _CRT_NONSTDC_NO_DEPRECATE.

answered Jul 4, 2020 at 0:16

Travis Vroman's user avatar

Project ->project_name properties -> Configuration Properties -> C/C++ -> Preprocessor -> Preprocessor Definitions -> Edit… add line _CRT_SECURE_NO_WARNINGS

answered Jan 5, 2017 at 20:47

Adam G.'s user avatar

Adam G.Adam G.

711 silver badge10 bronze badges

2 Августа 2017

Время чтения: 5 минут

Visual Studio unsafe error скриншот

Компилятор в Visual Studio сильно отличается от привычных большинству программистов GCC или CLANG, из-за чего при написании кода на C или C++ очень часто возникают неожиданные проблемы в виде ошибки использования стандартных функций, например, scanf, fopen, sscanf и тому подобным. Студия предлагает заменять функции на безопасные (повезёт, если нужно просто добавить _s к функции с ошибкой, но нередко в этих функциях идёт иной набор аргументов, нежели в обычной программе). Если вы не готовы с этим мириться, то этот пост для вас!

Давайте для начала создадим обычный консольный проект в Visual Studio и напишем простенькую программу, которая запрашивает ввод двух чисел, вводит их и затем выводит на экран.

#include "stdafx.h"
#include <stdio.h>

int main() {
	int a, b;

	printf("Enter a: ");
	scanf("%d", &a);

	printf("Enter b: ");
	scanf("%d", &b);

	printf("a: %d, b: %dn", a, b);
	return 0;
}

Попробовав выполнить сборку проекта, обнаружим те самые ошибки.

Чтобы Visual Studio не тратила ваши нервы, сделаем следующее:

1. Выберем пункт «Проект» в верхнем меню

2. В открывшемся списке щёлкнем по «Свойства название_проекта»

Программа, вводящая два числа и выводящая их

Программа, вводящая два числа и выводящая их

Ошибка компиляции из-за небезопасности функций

Ошибка компиляции из-за небезопасности функций

Проект -> Свойства {навание проекта}

Проект — Свойства {навание проекта}

3. В появившемся окне выберем Свойства конфигурации, C/C++, Препроцессор

4. В строке Определения препроцессора допишем в самый конец строку ;_CRT_SECURE_NO_WARNINGS

5. Нажмём ОК

Свойства конфигурации

Свойства конфигурации

Определения препроцессора

Определения препроцессора

OK

Нажимаем OK

6. Попробуем заново выполнить сборку проекта:

Успешная сборка проекта

Успешная сборка проекта

Ошибки исчезли, сборка прошла успешно и программа прекрасно работает! Теперь можно писать код как обычно, не переживая о необычном поведении Visual Studio!

Фото Перминова Андрея, автора этой статьи

Программист, сооснователь programforyou.ru, в постоянном поиске новых задач и алгоритмов

Языки программирования: Python, C, C++, Pascal, C#, Javascript

Выпускник МГУ им. М.В. Ломоносова

Содержание

  1. Предупреждение компилятора (уровень 3) C4996
  2. Комментарии
  3. Отключение предупреждения
  4. Отключение предупреждения для определенной строки кода
  5. Отключение предупреждения в файле
  6. Отключение предупреждения в сборках командной строки
  7. Отключение предупреждения для проекта в Visual Studio
  8. Отключение предупреждения с помощью макросов препроцессора
  9. Имена функций POSIX
  10. Небезопасные функции библиотеки CRT
  11. Небезопасные функции стандартной библиотеки
  12. Проверенные итераторы включены
  13. Небезопасный код MFC или ATL
  14. Устаревшие функции и переменные CRT
  15. Маршалинг ошибок в коде СРЕДЫ CLR
  16. Пример: определяемая пользователем нерекомендуемая функция
  17. Visual studio 2013 error c4996 fopen
  18. Answered by:
  19. Question
  20. Answers
  21. Русские Блоги
  22. Как устранить ошибку C4996: проблема fopen в VS2013
  23. Метод / шаг
  24. Интеллектуальная рекомендация
  25. IView CDN Загрузка значка шрифта нормальная, а значок шрифта не может быть загружен при локальной загрузке JS и CSS
  26. Критическое: ошибка настройки прослушивателя приложения класса org.springframework.web.context.ContextLoaderLis
  27. 1086 Не скажу (15 баллов)
  28. Pandas применяют параллельный процесс приложения, многоядерная скорость очистки данных
  29. PureMVC Learning (Tucao) Примечания

Предупреждение компилятора (уровень 3) C4996

Код использует функцию, член класса, переменную или определение типа, помеченную как нерекомендуемую. Символы устарели с помощью __declspec(deprecated) модификатора или атрибута C++14 [[deprecated]] . Фактическое предупреждающее сообщение C4996 задается модификатором или атрибутом deprecated объявления.

Это предупреждение всегда является преднамеренным сообщением автора файла заголовка, объявляющего символ. Не используйте устаревший символ без понимания последствий.

Комментарии

Многие функции, функции-члены, шаблоны функций и глобальные переменные в библиотеках Visual Studio устарели. Некоторые функции, такие как POSIX и функции Майкрософт, устарели, так как теперь они имеют другое предпочтительное имя. Некоторые функции библиотеки среды выполнения C устарели, так как они небезопасны и имеют более безопасный вариант. Другие нерекомендуемые, так как они устарели. Сообщения об устаревании обычно включают предполагаемую замену устаревшей функции или глобальной переменной.

Отключение предупреждения

Чтобы устранить проблему C4996, обычно рекомендуется изменить код. Вместо этого используйте предлагаемые функции и глобальные переменные. Если вам нужно использовать существующие функции или переменные по соображениям переносимости, можно отключить предупреждение.

Отключение предупреждения для определенной строки кода

Чтобы отключить предупреждение для определенной строки кода, используйте директиву warning pragma. #pragma warning(suppress : 4996)

Отключение предупреждения в файле

Чтобы отключить предупреждение в файле для всего следующего, используйте директиву pragma #pragma warning(disable : 4996) предупреждения.

Отключение предупреждения в сборках командной строки

Чтобы отключить предупреждение глобально в сборках командной строки, используйте параметр командной /wd4996 строки.

Отключение предупреждения для проекта в Visual Studio

Чтобы отключить предупреждение для всего проекта в интегрированной среде разработки Visual Studio, выполните следующие действия.

Откройте диалоговое окно «Страницы свойств » для проекта. Сведения об использовании диалогового окна «Страницы свойств» см. в разделе «Страницы свойств».

Выберите страницу свойств> конфигурацииC/C++>Advanced.

Измените свойство Disable Specific Warnings для добавления 4996 . Нажмите кнопку «ОК» , чтобы применить изменения.

Отключение предупреждения с помощью макросов препроцессора

Вы также можете использовать макросы препроцессора для отключения определенных классов предупреждений об устаревании, используемых в библиотеках. Эти макросы описаны ниже.

Чтобы определить макрос препроцессора в Visual Studio, выполните следующие действия.

Откройте диалоговое окно «Страницы свойств » для проекта. Сведения об использовании диалогового окна «Страницы свойств» см. в разделе «Страницы свойств».

Разверните свойства > конфигурации препроцессора C/C++>.

В свойстве «Определения препроцессора» добавьте имя макроса. Нажмите кнопку ОК для сохранения изменений, а затем выполните повторную сборку проекта.

Чтобы определить макрос только в определенных исходных файлах, добавьте строку, #define EXAMPLE_MACRO_NAME например перед любой строкой, включающей файл заголовка.

Ниже приведены некоторые распространенные источники предупреждений и ошибок C4996:

Имена функций POSIX

The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name: new-name. See online help for details.

Корпорация Майкрософт переименовывает некоторые функции БИБЛИОТЕК POSIX и Microsoft в CRT в соответствии с ограничениями C99 и C++03 для зарезервированных и глобальных имен, определенных реализацией. Не рекомендуется использовать только имена, а не сами функции. В большинстве случаев в имя функции был добавлен символ подчеркивания, чтобы создать соответствующее имя. Компилятор выдает предупреждение об устаревании для исходного имени функции и предлагает предпочтительное имя.

Чтобы устранить эту проблему, мы обычно рекомендуем изменить код, чтобы использовать предлагаемые имена функций. Однако обновленные имена зависят от корпорации Майкрософт. Если вам нужно использовать существующие имена функций по причинам переносимости, эти предупреждения можно отключить. Функции по-прежнему доступны в библиотеке под их исходными именами.

Чтобы отключить предупреждения об устаревании для этих функций, определите макрос _CRT_NONSTDC_NO_WARNINGS препроцессора. Этот макрос можно определить в командной строке, включив параметр /D_CRT_NONSTDC_NO_WARNINGS .

Небезопасные функции библиотеки CRT

This function or variable may be unsafe. Consider using safe-version instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

Корпорация Майкрософт не рекомендует использовать некоторые функции стандартной библиотеки CRT и C++, так как доступны более безопасные версии. Большинство устаревших функций позволяют отменить доступ на чтение или запись к буферам. Их неправильное использование может привести к серьезным проблемам безопасности. Компилятор выдает предупреждение об устаревании для этих функций и предлагает предпочтительную функцию.

Чтобы устранить эту проблему, рекомендуется использовать вместо нее функцию или переменную safe-version . Иногда невозможно, по соображениям переносимости или обратной совместимости. Тщательно убедитесь, что в коде невозможно перезаписать или перечитать буфер. Затем можно отключить предупреждение.

Чтобы отключить предупреждения об устаревании для этих функций в CRT, определите _CRT_SECURE_NO_WARNINGS .

Чтобы отключить предупреждения о нерекомендуемых глобальных переменных, определите _CRT_SECURE_NO_WARNINGS_GLOBALS .

Дополнительные сведения об этих устаревших функциях и глобальных функциях см. в разделе «Функции безопасности» в CRT и безопасных библиотеках: стандартная библиотека C++.

Небезопасные функции стандартной библиотеки

‘std:: function_name ::_Unchecked_iterators::_Deprecate’ Call to std:: function_name with parameters that may be unsafe — this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ ‘Checked Iterators’

В Visual Studio 2015 это предупреждение отображается в отладочных сборках, так как некоторые шаблоны функций стандартной библиотеки C++ не проверяют правильность параметров. Часто это связано с тем, что функции недостаточно информации для проверки границ контейнера. Или, поскольку итераторы могут использоваться неправильно с функцией. Это предупреждение помогает определить эти функции, так как они могут быть источником серьезных дыр в вашей программе. Дополнительные сведения см. в разделе «Проверенные итераторы».

Например, это предупреждение отображается в режиме отладки при передаче указателя std::copy на элемент вместо обычного массива. Чтобы устранить эту проблему, используйте соответствующий объявленный массив, чтобы библиотека может проверить экстенты массива и выполнить проверку границ.

В C++14 были обновлены несколько стандартных алгоритмов библиотеки с версиями «двойного диапазона». При использовании версий двойного диапазона второй диапазон обеспечивает необходимую проверку границ:

В этом примере показано несколько других способов использования стандартной библиотеки для проверки использования итератора, а также если флажок использования может быть опасным:

Если вы убедились, что код не может иметь ошибку переполнения буфера, вы можете отключить это предупреждение. Чтобы отключить предупреждения для этих функций, определите _SCL_SECURE_NO_WARNINGS .

Проверенные итераторы включены

C4996 также может возникнуть, если вы не используете проверяемый итератор, если _ITERATOR_DEBUG_LEVEL он определен как 1 или 2. По умолчанию для сборок в режиме отладки установлено значение 2, а для розничных сборок — значение 0. Дополнительные сведения см. в разделе «Проверенные итераторы».

Небезопасный код MFC или ATL

C4996 может возникнуть, если вы используете функции MFC или ATL, которые были нерекомендуемые по соображениям безопасности.

Чтобы устранить эту проблему, настоятельно рекомендуется изменить код для использования обновленных функций.

Сведения о том, как отключить эти предупреждения, см. в разделе _AFX_SECURE_NO_WARNINGS .

Устаревшие функции и переменные CRT

This function or variable has been superseded by newer library or operating system functionality. Consider using new_item instead. See online help for details.

Некоторые функции и глобальные переменные библиотеки устарели. Эти функции и переменные могут быть удалены в будущей версии библиотеки. Компилятор выдает предупреждение об устаревании для этих элементов и предлагает предпочтительную альтернативу.

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

Чтобы отключить предупреждения об устаревании для этих элементов, определите _CRT_OBSOLETE_NO_WARNINGS . Дополнительные сведения см. в документации по устаревшей функции или переменной.

Маршалинг ошибок в коде СРЕДЫ CLR

C4996 также может возникать при использовании библиотеки маршалинга CLR. В этом случае C4996 является ошибкой, а не предупреждением. Эта ошибка возникает при marshal_as преобразовании между двумя типами данных, которым требуется marshal_context класс. Эту ошибку также можно получить, если библиотека маршалинга не поддерживает преобразование. Дополнительные сведения о библиотеке маршалинга см. в обзоре маршалинга в C++.

В этом примере возникает ошибка C4996, так как для библиотеки маршалинга требуется контекст для преобразования из a System::String в . const char *

Пример: определяемая пользователем нерекомендуемая функция

Атрибут можно использовать в собственном коде deprecated , чтобы предупреждать вызывающих объектов, если вы больше не рекомендуете использовать определенные функции. В этом примере C4996 создается в двух местах: одна для строки, в которой объявлена нерекомендуемая функция, и одна для строки, в которой используется функция.

Источник

Visual studio 2013 error c4996 fopen

This forum has migrated to Microsoft Q&A. Visit Microsoft Q&A to post new questions.

Answered by:

Question

I got this error when i ran my program:

C:OpenCV2.3buildincludeopencv2/flann/logger.h(70): warning C4996: ‘fopen’: This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

and then when I tried using fopen_s (replaced fopen with fopen_s), I got this error:

C:OpenCV2.3buildincludeopencv2/flann/logger.h(70): error C2660: ‘fopen_s’ : function does not take 2 arguments

Does anyone have any suggestions?

Answers

Use your favourite search engine — Bing, Google, Yahoo —
and do a search for: msdn fopen_s

Follow the links with msdn in the URL.

Use the same procedure whenever you need documentation
for a VC++ feature or keyword.

Alternatively, put the cursor on the term in question
(e.g. — fopen_s) and press F1. You should get the help
for that term.

If you have the Dynamic Help window open (Ctrl-F1)
then when you put the *editor’s* cursor on a word
a list of available help topics will automatically
appear in the Dynamic Help window. Click on the
most obvious choice to get the compiler’s help.

It should rarely be necessary to ask others to
give you links to documentation or help for common
terms/words/features used when constructing a
program — especially those related to the C and C++
languages.

Источник

Русские Блоги

Как устранить ошибку C4996: проблема fopen в VS2013

Метод / шаг

Щелкните правой кнопкой мыши файл проекта 1 и выберите 2

Затем появится страница свойств файла, нажмите 1 «Препроцессор», затем нажмите 2, чтобы открыть препроцессор, как показано ниже.

Скопируйте «_CRT_SECURE_NO_WARNINGS» в красное поле ниже и нажмите «Применить».

Как только проблема будет решена, можно переходить к следующей работе

Мне так намного лучше, проблема решается постоянно

Интеллектуальная рекомендация

IView CDN Загрузка значка шрифта нормальная, а значок шрифта не может быть загружен при локальной загрузке JS и CSS

Используйте iview, чтобы сделать небольшой инструмент. Чтобы не затронуть другие платформы, загрузите JS и CSS CDN на локальные ссылки. В результате значок шрифта не может быть загружен. Просмо.

Критическое: ошибка настройки прослушивателя приложения класса org.springframework.web.context.ContextLoaderLis

1 Обзор Серверная программа, которая обычно запускалась раньше, открылась сегодня, и неожиданно появилась эта ошибка. Интуитивно понятно, что не хватает связанных с Spring пакетов, но после удаления п.

1086 Не скажу (15 баллов)

При выполнении домашнего задания друг, сидящий рядом с ним, спросил вас: «Сколько будет пять умножить на семь?» Вы должны вежливо улыбнуться и сказать ему: «Пятьдесят три». Это.

Pandas применяют параллельный процесс приложения, многоядерная скорость очистки данных

В конкурсе Algorith Algorith Algorith Algorith Algorith 2019 года используется многофункциональная уборка номера ускорения. Будет использовать панды. Но сама панда, кажется, не имеет механизма для мно.

PureMVC Learning (Tucao) Примечания

Справочная статья:Введение подробного PrueMVC Использованная литература:Дело UnityPureMvc Основная цель этой статьи состоит в том, чтобы организовать соответствующие ресурсы о PureMVC. Что касается Pu.

Источник

I follow the instruction change the strupr to _strupr and the give other erro, then I change to _strupr_s, but it said

argument type are char *

can anyone give a help?

// interpreter.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <cctype>
#include "Interpreter.h"
using namespace std;

double Statement::findValue(char *id)   //Return the  value
{
IdNode tmp(id);
list<IdNode>::iterator i = find(idList.begin(), idList.end(), tmp);
if (i != idList.end())
    return i->value;
else
    issueError("unknown variable");
return 0;
}
void Statement::processNode(char *id, double e) //Update the value or add it to the list
{
IdNode tmp(id, e);
list<IdNode>::iterator i = find(idList.begin(), idList.end(), tmp);
if (i != idList.end())
    i->value = e;
else
    idList.push_front(tmp);
 }
 void Statement::readId(char *id)  //Read input into an array
{
int i = 0;
if (isspace(ch))
    cin >> ch;
if (isalpha(ch)){ //If it is a letter, save the subsequent numbers or letters.
    while (isalnum(ch)){
        id[i++] = ch;
        cin.get(ch);
    }
    id[i] = '';
}
else
    issueError("Identifier expected");
}
double Statement::factor()  //Factor processing
{
double var, minus = 1.0;
static char id[200];
cin >> ch;
while (ch == '+' || ch == '-'){ //Is the symbol before the number
    if (ch == '-')   //Determine positive and negative
        minus *= -1.0;
    cin >> ch;
}
if (isdigit(ch) || ch == '.'){   //number
    cin.putback(ch);
    cin >> var >> ch; //save vaule
}
else if (ch == '('){ //Equal to the left parenthesis to handle the expression inside the parentheses
    var = expression(); //Recursively processing expressions in parentheses
    if (ch == ')')   //The right parenthesis continues to process ch
        cin >> ch;
    else
        issueError("right paren left out");
}
else{
    readId(id);
    if (isspace(ch))
        cin >> ch;
    var = findValue(id);
}
return minus * var;
}
double Statement::term()
{
double f = factor();
while (true){
    switch (ch){
    case '*':
        f *= factor();
        break;
    case '/':
        f /= factor();
        break;
    default:
        return f;
    }
  }
 }
double Statement::expression()
{
double t = term();
while (true){
    switch (ch){
    case '+':
        t += term();
        break;
    case '-':
        t -= term();
        break;
    default:
        return t;
    }
}
}
void Statement::getStatement()
{
char id[20];
char command[20];
double e;
cout << "enter a statement: ";
cin >> ch;
readId(id);
_strupr_s(strcpy(command, id));
if (strcmp(command, "STATUS") == 0)
    cout << *this;
if (strcmp(command, "PRINT") == 0){
    readId(id);
    cout << id << " = " << findValue(id) << endl;
}
else if (strcmp(command, "END") == 0)
    exit(0);
else{
    if (isspace(ch))
        cin >> ch;
    if (ch == '='){
        e = expression();
        if (ch != ';')
            issueError("there are some extras in the statement. ");
        else
            processNode(id, e);
    }
    else
        issueError("'=' is missing");
}
}
ostream &operator<<(ostream &out, const Statement &s)
{
list<IdNode>::const_iterator i = s.idList.begin();
for (; i != s.idList.end(); i++)
    out << *i;
out << endl;
return out;
}
ostream &operator<<(ostream &out, const IdNode &r)
{
out << r.id << " = " << r.value << endl;
return out;
}

int main()
{
Statement statement;
cout << "the program processes statements  of the following format:n"
    << "t<id> = <expr>;ntprint <id>ntstatusntendnn";
while (true)
    statement.getStatement();

return 0;
}


// TODO: reference additional headers your program requires here

I follow the instruction change the strupr to _strupr and the give other erro, then I change to _strupr_s, but it said

argument type are char *

can anyone give a help?

// interpreter.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <cctype>
#include "Interpreter.h"
using namespace std;

double Statement::findValue(char *id)   //Return the  value
{
IdNode tmp(id);
list<IdNode>::iterator i = find(idList.begin(), idList.end(), tmp);
if (i != idList.end())
    return i->value;
else
    issueError("unknown variable");
return 0;
}
void Statement::processNode(char *id, double e) //Update the value or add it to the list
{
IdNode tmp(id, e);
list<IdNode>::iterator i = find(idList.begin(), idList.end(), tmp);
if (i != idList.end())
    i->value = e;
else
    idList.push_front(tmp);
 }
 void Statement::readId(char *id)  //Read input into an array
{
int i = 0;
if (isspace(ch))
    cin >> ch;
if (isalpha(ch)){ //If it is a letter, save the subsequent numbers or letters.
    while (isalnum(ch)){
        id[i++] = ch;
        cin.get(ch);
    }
    id[i] = '';
}
else
    issueError("Identifier expected");
}
double Statement::factor()  //Factor processing
{
double var, minus = 1.0;
static char id[200];
cin >> ch;
while (ch == '+' || ch == '-'){ //Is the symbol before the number
    if (ch == '-')   //Determine positive and negative
        minus *= -1.0;
    cin >> ch;
}
if (isdigit(ch) || ch == '.'){   //number
    cin.putback(ch);
    cin >> var >> ch; //save vaule
}
else if (ch == '('){ //Equal to the left parenthesis to handle the expression inside the parentheses
    var = expression(); //Recursively processing expressions in parentheses
    if (ch == ')')   //The right parenthesis continues to process ch
        cin >> ch;
    else
        issueError("right paren left out");
}
else{
    readId(id);
    if (isspace(ch))
        cin >> ch;
    var = findValue(id);
}
return minus * var;
}
double Statement::term()
{
double f = factor();
while (true){
    switch (ch){
    case '*':
        f *= factor();
        break;
    case '/':
        f /= factor();
        break;
    default:
        return f;
    }
  }
 }
double Statement::expression()
{
double t = term();
while (true){
    switch (ch){
    case '+':
        t += term();
        break;
    case '-':
        t -= term();
        break;
    default:
        return t;
    }
}
}
void Statement::getStatement()
{
char id[20];
char command[20];
double e;
cout << "enter a statement: ";
cin >> ch;
readId(id);
_strupr_s(strcpy(command, id));
if (strcmp(command, "STATUS") == 0)
    cout << *this;
if (strcmp(command, "PRINT") == 0){
    readId(id);
    cout << id << " = " << findValue(id) << endl;
}
else if (strcmp(command, "END") == 0)
    exit(0);
else{
    if (isspace(ch))
        cin >> ch;
    if (ch == '='){
        e = expression();
        if (ch != ';')
            issueError("there are some extras in the statement. ");
        else
            processNode(id, e);
    }
    else
        issueError("'=' is missing");
}
}
ostream &operator<<(ostream &out, const Statement &s)
{
list<IdNode>::const_iterator i = s.idList.begin();
for (; i != s.idList.end(); i++)
    out << *i;
out << endl;
return out;
}
ostream &operator<<(ostream &out, const IdNode &r)
{
out << r.id << " = " << r.value << endl;
return out;
}

int main()
{
Statement statement;
cout << "the program processes statements  of the following format:n"
    << "t<id> = <expr>;ntprint <id>ntstatusntendnn";
while (true)
    statement.getStatement();

return 0;
}


// TODO: reference additional headers your program requires here

Здравствуйте, изучаю Win32 API, делаю все как в примере — (в примере используется VS 6, я пользуюсь VS Community 2015)

выдает ошибку:

Ошибка C4996
‘strcat’: This function or variable may be unsafe. Consider using strcat_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
Hello2 c:usersгеоргийdocumentsvisual studio 2015projectsuniversalbasehello2kwnd.cpp

вот сам код:

///////////////////////////////////////////////////////////////////////////////
/// KWnd.cpp                                                                ///
///////////////////////////////////////////////////////////////////////////////

#include "KWnd.h"

KWnd::KWnd(LPCTSTR windowName, HINSTANCE hInst, int cmdShow,
	LRESULT(WINAPI *pWndProc)(HWND, UINT, WPARAM, LPARAM),
	LPCSTR menuName, int x, int y, int width, int height,
	UINT classStyle, DWORD windowStyle, HWND hParent)
{
	char szClassName[] = "KWndClass";

	wc.cbSize = sizeof(wc);
	wc.style = classStyle;
	wc.lpfnWndProc = pWndProc;
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hInstance = hInst;
	wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	wc.hCursor = LoadCursor(NULL, IDC_ARROW);
	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	wc.lpszMenuName = menuName;
	wc.lpszClassName = szClassName;
	wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

	// Регистрируем класс окна
	if (!RegisterClassEx(&wc)) {
		char msg[100] = "Не могу зарегестрировать class: ";
		strcat(msg, szClassName);
		MessageBox(NULL, msg, "Ошибка", MB_OK);
	}

	// Создаем окно
	hWnd = CreateWindow(szClassName, windowName, windowStyle,
		x, y, width, height, hParent, HMENU(NULL), hInst, NULL);

	if (!hWnd) {
		char text[100] = "Не могусоздать окно: ";
		strcat(text, windowName);
		MessageBox(NULL, text, "Ошибка", MB_OK);
		return;
	}

	// Показываем окно
	ShowWindow(hWnd, cmdShow);
}

Пожалуйста Подскажите что не так сделал?

Понравилась статья? Поделить с друзьями:
  • C42268 ошибка форд
  • C7301 kyocera ошибка
  • C42268 ошибка на мондео
  • C7104 ошибка kyocera
  • C422 64 ошибка форд фокус 3