C下划线原型语法

时间:2010-04-21 22:42:30

标签: c ruby

我正在尝试编译ruby模块,我的编译器被阻塞了。我认为它可能与ruby.h中的一行有关:

void rb_check_type _((VALUE,int));

我之前从未见过这种_语法。这是什么意思?它会给我的编译器(Visual Studio)带来问题吗?

2 个答案:

答案 0 :(得分:2)

它看起来像一个带有名为'_'的宏的宏调用。它是赠品的双重parens。您通常只能在调用复杂的宏时看到它们希望能够使用任意数量的参数生成函数调用。

因此,各种可能性似乎是:

  1. 宏不应该被称为'_'并且某些东西已经损坏了该行。也许rb_check_type_是宏的正确名称。也许还有别的东西。寻找类似的电话,看看它们有何不同。
  2. 宏确实是'_',并且由于某种原因没有定义它。这取决于您包含的头文件。你或许忘了一个吗?
  3. 宏存在并且确实是'_'但它扩展到了错误的地方。可以通过查看编译器的宏扩展输出来检查。大多数编译器都有办法请求。
  4. 我真的不能给你更多的建议,因为你没有详细说明你的编译器实际产生了什么错误。

答案 1 :(得分:1)

这个宏在ruby.h中真正命名为'_'(或者称为ruby.h的.h)。 更糟糕的是,其他包做同样的事情,例如wxWidgets的。 根据g ++ 3.3,可以:

    #include "ruby.h"
    #undef _
    #include "wx/filename.h"

并且编译后的输出将使用wxWidget的_版本(发生了这种情况 为我工作),但在g ++ 4.6.1下#undef完全取消_ 尽管在wxWidgets包括之前发生了#undef。这意味着:

  1. 我不能在不关闭wx的_
  2. 的情况下关闭ruby的_
  3. 我不能在不破坏wx函数运行方式的情况下留下ruby的_
  4. 如果没有双方摆脱宏,解决方案似乎不清楚。 我还没有找到一种方法在我自己的代码中使用命名空间来绕过 这个 - 还在努力......