我正在使用适用于 Windows 桌面的 Visual Studio Express 2012。
我总是遇到错误
Error C4996: 'strtok': This function or variable may be unsafe.
Consider using strtok_s instead.
To disable deprecation, use _CRT_SECURE_NO_WARNINGS.
See online help for details.
当我尝试构建以下内容时:
#include "stdafx.h"
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring>
using namespace std;
int main() {
char the_string[81], *p;
cout << "Input a string to parse: ";
cin.getline(the_string, 81);
p = strtok(the_string, ",");
while (p != NULL) {
cout << p << endl;
p = strtok(NULL, ",");
}
system("PAUSE");
return 0;
}
即使我定义了
_CRT_SECURE_NO_WARNINGS
,为什么我还是会收到此错误,如何修复它?
由于预编译头文件(stdafx.h)的内容,您的#define 不起作用。 样板看起来像这样:
#pragma once
#include "targetver.h"
#include <stdio.h>
#include <tchar.h>
导致问题的是最后两个#include,那些.h 文件本身已经#include string.h。 因此你的#define 已经太晚了。
除了在编译器设置中定义宏之外,简单的解决方法是将 #define 移动到 stdafx.h 文件中。 修复:
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include "targetver.h"
#include <stdio.h>
#include <tchar.h>
这可能是一篇旧帖子,但我最近遇到了类似的问题。 我进入项目选项 -> C/C++ -> 预处理器 -> 将 _CRT_SECURE_NO_WARNINGS 添加到预处理器定义列表中。 这样您就不必将其放入每个文件中。
尝试以下。
#pragma warning (disable : 4996)
请注意错误编号为 C4996。
看起来您打开了一个编译器选项,强制编译器将所有警告视为错误。要么关闭此选项,要么确实使用宏 _CRT_SECURE_NO_WARNINGS