C подчеркивает синтаксис прототипа - PullRequest
1 голос
/ 22 апреля 2010

Я пытался скомпилировать модуль ruby, и мой компилятор захлебнулся. Я думаю, что это как-то связано со строкой в ​​ruby.h:

void rb_check_type _((VALUE,int));

Я никогда раньше не видел этот синтаксис _. Что это значит? Может ли это вызвать проблемы для моего компилятора (Visual Studio)?

Ответы [ 2 ]

2 голосов
/ 22 апреля 2010

Это сильно похоже на вызов макроса с макросом с именем '_'. Это двойные пары, которые являются дешевой распродажей. Обычно вы видите это только в вызовах сложных макросов, которые хотят иметь возможность генерировать вызовы функций с произвольным числом параметров.

Итак, различные возможности кажутся:

  1. Макрос не должен называться _, и что-то повредило эту строку. Возможно, rb_check_type_ - правильное имя макроса. Может быть, что-то еще. Поищите похожие звонки и посмотрите, чем они отличаются.
  2. Макрос действительно равен «_», и по какой-то причине он не определен. Это будет зависеть от заголовочных файлов, которые вы включаете. Вы, возможно, забыли один?
  3. Макрос существует и действительно является '_', но расширяется до чего-то неправильного. Это можно проверить, посмотрев на расширенный макрос компилятора. У большинства компиляторов есть способ запросить это.

Я не могу дать вам больше советов, чем этот, поскольку вы не дали никаких подробностей относительно того, какая ошибка на самом деле вызвала ваш компилятор.

1 голос
/ 14 июля 2011

Макрос действительно называется '_' в ruby.h (или подчинённо называемый .h в ruby.h).Хуже всего то, что другие пакеты делают то же самое, например, wxWidgets.В g ++ 3.3 можно было бы:

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

, и скомпилированный вывод будет использовать версию _ для wxWidget (что мне помогло), но в g ++ 4.6.1 #undef полностью отменяет определение _, несмотря на#undef происходит до включения wxWidgets.Это означает:

  1. Я не могу выключить рубин _ без выключения wx _
  2. Я не могу оставить рубин _ без нарушения работы функций wx

Решение кажется неясным без того, чтобы обе стороны отказались от макросов.Я не нашел способа использовать пространства имен в своем собственном коде, чтобы обойти это - все еще пытаюсь ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...