2010-04-21 45 views
1

我试图编译一个ruby模块,并且我的编译器被阻塞了。我认为这可能与ruby.h中的一行有关:C下划线原型语法

void rb_check_type _((VALUE,int)); 

我从来没有见过这种_语法。这是什么意思?它会导致我的编译器(Visual Studio)出现问题吗?

回答

2

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

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

  1. 宏不应该叫“_”有什么东西损坏了该行。也许rb_check_type_是宏的正确名称。也许别的东西是。寻找类似的电话,看看他们有什么不同。
  2. 该宏确实是'_',并且由于某种原因没有定义该宏。这将取决于您包含的头文件。你有没有忘记一个?
  3. 这个宏存在并且确实是'_'但是它扩展到了错误的地方。这可以通过查看编译器的宏扩展输出来检查。大多数编译器都有一种方法来请求它。

我真的不能给你任何更多的建议,因为你没有给出关于你的编译器实际产生什么错误的任何细节。

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. 我不能离开红宝石的_在不破坏如何WX的功能运行

的解决方案,而双方越来越远,似乎都不清楚来自宏。 我还没有找到在我自己的代码中使用命名空间的方式来解决 this - 仍在尝试...