因为" isblank'而且Mingw没有编译。未在此范围内宣布"错误

时间:2015-01-13 16:34:45

标签: c++ c++11 mingw

我尝试编译&将以下程序与mingw联系起来。当我使用默认版本时,它运行良好。但是,当我使用c ++ 11版本时,它不会编译并给我以下错误newfile.cpp:22:18: error: 'isblank' was not declared in this scope。 为了测试以下程序,只需在main中调用_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,一切都配置得很好(默认)。

我尝试添加/删除命名空间std。问题似乎是在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';
}

2 个答案:

答案 0 :(得分:2)

在我的GNU库版本中,isblank标头中的<ctype.h>声明受到某些条件编译指令的保护,但这些指令应该使该函数在C ++中可用。

但是,在<cctype>标题中,此函数与所有其他声明分开,并由于某种原因给予特殊处理。如果定义了宏std,则仅在命名空间_GLIBCXX_USE_C99_CTYPE_TR1中可用。这就是<cctype>

中的内容
#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

我不知道_GLIBCXX_USE_C99_CTYPE_TR1宏应该服务的目的是什么。在我的GCC安装中,定义了这个宏,这使得isblank在我的情况下可用。

您可能想要检查一下<cctype>的样子,看看是否还有这样的事情。

答案 1 :(得分:1)

当我在转换单元中未定义 STRICT_ANSI 时,将-U__STRICT_ANSI__添加到编译器选项中。但我想知道我的程序的哪一部分违反了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