【问题标题】:Mingw doesn't compile due to "'isblank' was not declared in this scope" error由于“未在此范围内声明‘isblank’”错误,Mingw 无法编译
【发布时间】:2015-01-13 16:34:44
【问题描述】:

我尝试用 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,一切都配置好(默认)。

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

【问题讨论】:

  • 您是否尝试递归调用_isblank?
  • 当然!我写了 _isblank 是因为 isblank 在 std=c++11 程序中的任何地方都不起作用,但我无法重新发明所有库函数,因为编译器找不到它们!
  • 通常以下划线开头的函数是为编译器或库实现保留的。您是否尝试过 grepping MinGW 包含 isblank 的标头?
  • 我也尝试了 istDasBlank() 但没有区别

标签: c++ c++11 mingw


【解决方案1】:

在我的 GNU 库版本中,&lt;ctype.h&gt; 标头中的 isblank 声明受到一些条件编译指令的保护,但仍应使该函数在 C++ 中可用。

但是,在&lt;cctype&gt; 标头中,此函数与所有其他声明分开,并出于某种原因给予特殊处理。如果定义了宏 _GLIBCXX_USE_C99_CTYPE_TR1,则它仅在命名空间 std 中可用。这是&lt;cctype&gt;内部的样子

#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 在我的情况下可用。

您可能想检查您的&lt;cctype&gt; 的外观,看看您身边是否也发生了类似的事情。

【讨论】:

    【解决方案2】:

    当我在翻译单元中取消定义 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
    

    【讨论】:

    • 除了前导下划线(你说你已经改变了),一切看起来都很好。你的 .h 是什么样的?只是函数原型?
    • 标头只定义了conf_info_t,没有别的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    • 2011-10-08
    • 2011-01-31
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多