【问题标题】:isspace macro conflicting with isspace function in locale_facets.hisspace 宏与 locale_facets.h 中的 isspace 函数冲突
【发布时间】:2012-06-19 00:47:59
【问题描述】:

我正在构建一个包含 cuda 代码的 cmake 项目。我无法编译包含多个 h 文件的 cuda 文件之一。这是我收到的编译器错误

In file included from /usr/include/c++/4.4/bits/basic_ios.h:39,
                 from /usr/include/c++/4.4/ios:45,
                 from /usr/include/c++/4.4/ostream:40,
                 from /usr/include/c++/4.4/iostream:40,
                 from /home/pfeifs/Developement/Deform/LinuxDeform/LibDeform/Deform/cutil_comfunc.h:20,
                 from /home/pfeifs/Developement/Deform/LinuxDeform/LibDeform/Deform/VectorMathDef.h:22,
                 from /home/pfeifs/Developement/Deform/LinuxDeform/LibDeform/src/Deform/VectorMath.cu:15:
/usr/include/c++/4.4/bits/locale_facets.h:2521:44: error: macro "isspace" passed 2 arguments, but takes just 1

isspace() 被定义为在<ctype.h> 中需要一个参数的宏,并在locale_facets.h 中声明为模板函数。 (这些都是标准文件。)但是在locale_facets.h 的开头,包含<cctype> 并且取消声明宏。

非常感谢您对此问题的任何帮助或见解。

【问题讨论】:

  • 尝试重新排序cutil_comfunc.h 文件中的#include 文件顺序,以便C++ 包含在C 包含之前。

标签: c++ c linux cuda cmake


【解决方案1】:

不要混合和匹配 C 和 C++ 标头。

使用#include <locale> 拉入带有两个参数的std::isspace 模板。将#include <cctype> 用于ctype.h 的C++ 安全包含,不会导致与STL 冲突。

如果您正在编写 C 程序并且不需要或不需要 C++,那么包括 ctype.h 和使用只有一个参数的 isspace 函数应该没有问题。

【讨论】:

  • +1 表示第一句话,如果没有别的。我假设其余部分是正确的,但即使不是,第一句话也是问题的核心。
  • 在我需要包含的另一个随机库的包含路径中实际上有一个额外的 ctype.h 文件,该文件显然比我打算包含的标准 ctype 库在包含路径中更早。我能够解决这个问题,一切正常。
  • 完美!也没有正确的方法,但如果我的包含顺序是这样的,我发现我的问题会更少:C++,第 3 方库,我的库,本地标头
  • 感谢您的帮助,宏很麻烦。
  • 这个解决方案帮助我解决了这里描述的问题:bugs.python.org/issue10910
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多