C++ Mingw不';“由于”而无法编译';isblank';未在此范围内声明;错误

C++ Mingw不';“由于”而无法编译';isblank';未在此范围内声明;错误,c++,c++11,mingw,C++,C++11,Mingw,我尝试用mingw编译并链接以下程序。当我使用默认版本时,它工作得很好。但是,当我使用c++11版本时,它不会编译,并给我以下错误newfile.cpp:22:18:error:“isblank”未在此范围内声明。 为了测试以下程序,在main中调用\u isblank函数就足够了 对于编译Netbeans 8.0.2,使用g++-c-g-Wall-std=c++11-MMD-MP-MF“build/Debug/MinGW_1-Windows/newfile.o.d”-o build/Debug

我尝试用mingw编译并链接以下程序。当我使用默认版本时,它工作得很好。但是,当我使用c++11版本时,它不会编译,并给我以下错误
newfile.cpp:22:18:error:“isblank”未在此范围内声明
。 为了测试以下程序,在main中调用
\u isblank
函数就足够了

对于编译Netbeans 8.0.2,使用
g++-c-g-Wall-std=c++11-MMD-MP-MF“build/Debug/MinGW_1-Windows/newfile.o.d”-o build/Debug/MinGW_1-Windows/newfile.o newfile.cpp

mingw版本是4.8.1,所有配置都很好(默认)

我尝试添加/删除名称空间标准。问题似乎出在cctype头中!但我想知道如何解决它。该项目将不得不在linux上用g++编译!这些问题还会存在吗

#include <cstdlib>
#include <cctype>
#include <fstream>
#include <sstream>
#include <string>
#include <iostream>
#include <map>
#include <functional>
#include "newfile.h"

using namespace std;
conf_info_t CONF_INFO;

#define CONF_FILE_ADDRESS "confs.txt"
//
//typedef std::map<std::string, std::function<void (const std::string&)>> confMap_t;
//confMap_t confMap;

int _isblank(int c){
    return isblank(c);
    //return c == ' ' || c == '\t';
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括“newfile.h”
使用名称空间std;
conf_info_t conf_info;
#定义配置文件地址“confs.txt”
//
//typedef std::map confMap\t;
//confMap\u t confMap;
整数为空(整数c){
返回为空(c);
//返回c=''| | c='\t';
}

当我在翻译单元中未定义STRICT\U ANSI并将-U\U STRICT\U ANSI\U添加到编译器选项时,它就起作用了。但是我想知道我的程序中哪一部分违反了C++标准。 本应按照以下方式进行编译:

g++ -U__STRICT_ANSI__   -c -g -Wall -std=c++11 -MMD -MP -MF "build/Debug/MinGW_1-Windows/main.o.d" -o build/Debug/MinGW_1-Windows/main.o main.cpp

在GNU库的版本中,<代码>空白> >在代码> >/Cord>头上,由一些条件编译指令来保护,但这应该使C++中的函数可用。p> 但是,在

标题中,此函数与所有其他声明分离,并出于某种原因给予特殊处理。只有在定义了宏
\u GLIBCXX\u USE\u C99\u CTYPE\u TR1
的情况下,才会在名称空间
std
中提供该属性。这就是它在

我不知道
\u GLIBCXX\u使用\u C99\u CTYPE\u TR1
宏的目的是什么。在我的GCC安装中,定义了这个宏,这使得在我的情况下,
isblank
可用


你可能想检查一下你的
是什么样子的,看看你这边是否也发生了类似的事情。

你是想递归地调用isblank吗?当然!我写了_isblank,因为isblank在std=c++11的程序中任何地方都不起作用,但我不能重新创建所有库函数,因为编译器找不到它们!通常,以下划线开头的函数是为编译器或库实现保留的。您是否尝试过将isblank的MinGW include标题灰显?我也尝试过使用istDasBlank(),但除了前导下划线(您说您已更改)之外,没有什么区别,一切看起来都正常。你的.h看起来像什么?只有函数原型?标题只定义conf_info_t,其他什么都不定义!
#if __cplusplus >= 201103L

#ifdef _GLIBCXX_USE_C99_CTYPE_TR1

#undef isblank

namespace std
{
  using ::isblank;
} // namespace std

#endif // _GLIBCXX_USE_C99_CTYPE_TR1

#endif // C++11