为什么即使我定义了_CRT_SECURE_NO_WARNINGS,编译器仍然警告我有关不安全的strtok?

问题描述 投票:0回答:4

我正在使用适用于 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
,为什么我还是会收到此错误,如何修复它?

c++ strtok
4个回答
7
投票

由于预编译头文件(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>

6
投票

这可能是一篇旧帖子,但我最近遇到了类似的问题。 我进入项目选项 -> C/C++ -> 预处理器 -> 将 _CRT_SECURE_NO_WARNINGS 添加到预处理器定义列表中。 这样您就不必将其放入每个文件中。 enter image description here


2
投票

尝试以下。

#pragma warning (disable : 4996)

请注意错误编号为 C4996。


-1
投票

看起来您打开了一个编译器选项,强制编译器将所有警告视为错误。要么关闭此选项,要么确实使用宏 _CRT_SECURE_NO_WARNINGS

© www.soinside.com 2019 - 2024. All rights reserved.