【问题标题】:XCode C++ assert re-definition not allowed by compiler编译器不允许 XCode C++ 断言重新定义
【发布时间】:2013-09-06 14:54:58
【问题描述】:

我正在将一些 C++ 代码库从 Windows VC10 移植到 Mac XCode 10.7。我有一个包含“assert()”的宏。Microsoft 编译器对以下定义没有问题:

void assert(bool result, const char *call, const char *file, int line);
/// Wraps \c assert().//
#define MY_ASSERT(call) (mynsp::assert((call), #call, __FILE__, __LINE__))

当 XCode 向我抛出错误时: 提供给类函数宏调用的参数过多

作为 OS X 和 LLVM 的新手,我的问题是如何解决这个问题?

顺便说一句,assert() 声明是用自定义命名空间 (mynsp) 包装的

【问题讨论】:

  • 适用于 G++。您向宏传递了多少个参数?
  • 你有<cassert>吗?
  • 不,我没有。应该吗?
  • 不,你不应该。可能是其他一些标题。这是宏很烂的原因之一。
  • assert<cassert> 中定义的宏的名称;我建议您为函数使用不同的名称。这将解决您的问题,或者至少可以防止人们阅读您的代码的 WTF 时刻。当我在代码中看到assert 时,我只是假设它是标准的。

标签: c++ xcode macos llvm


【解决方案1】:

标准头文件<cassert>(或C 中的<assert.h>)将assert 定义为宏,使该名称无法用于任何其他用途。即使您自己不包含该标头,它也可能是从其他标头间接包含的。这可能就是为什么您只能在一个平台上看到问题,而不是同时在两个平台上看到问题。

最好的选择是重命名你的函数以避免冲突;或者,您可以在任何想要将名称用于您的目的的文件中使用#undef assert

【讨论】:

  • 确实,只是换个名字而已。
【解决方案2】:

右键单击原型中的assert,然后选择“跳转到定义”。您会看到它在某处被#define 定义,从而为您造成了这个问题。

您可以通过#undef assert 克服它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    • 1970-01-01
    • 2011-08-07
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多