我尝试编译&将以下程序与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';
}
答案 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