как определить типизацию из функции - PullRequest
4 голосов
/ 01 марта 2012

Во время практики учебника по GTK + я столкнулся с примером кода, который выглядит следующим образом:

gtk_misc_set_alignment (GTK_MISC (label), 0, 0);

во всем коде авторов есть пробел между функцией и (), но также и в типах.Очевидно, что gtk_misc_set_alignment () - это функция, но как мне узнать, является ли GTK_MISC (метка) функцией или типом?

Ответы [ 4 ]

9 голосов
/ 01 марта 2012

На самом деле, GTK_MISC - это макрос, который скрывает "классический" тип C.Это, вероятно, что-то вроде:

#define GTK_MISC(p)    ((GtkMisc *)(p))

Вместо этого вы могли бы просто написать:

gtk_misc_set_alignment ((GtkMisc *) label, 0, 0);

Я не знаю точно, почему GTK предоставляет такие макросы, возможно, им нравится "эмулировать"«подобие функции», предоставляемое C ++.


Edit

Хорошо, возможно, я понял.Я не нашел конкретной документации для GTK_MISC, но, похоже, это то же самое, что и G_OBJECT, которая гласит:

#define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))

Casts aGObject или производный указатель в (GObject*) указатель.В зависимости от текущего уровня отладки эта функция может вызывать определенные проверки во время выполнения для выявления недопустимых приведений.

Таким образом, вероятно, GTK_MISC также выполняет некоторые проверки времени выполнения для указателя, чтобы проверить, может ли он быть фактически приведен к GtkMisk *.Вы могли бы сказать, что это в некоторой степени концепция dynamic_cast в C ++.

5 голосов
/ 01 марта 2012

Typecast выполняется с типом внутри круглых скобок

( type ) object         // typecast
identifier ( argument ) // function call
4 голосов
/ 01 марта 2012

В C type(value) не является допустимым приведением.Это синтаксис C ++.

0 голосов
/ 01 апреля 2012

GLib, и поэтому система типов GTK немного отличается от системы типов C. GLib разработан на C, и поэтому не может иметь реальных классов, таких как C ++, C # или Java. Так что им нужно как-то подражать. Каждый объект на самом деле представляет собой структуру (в данном случае, структуру _GtkMisc), которая имеет поле класса, которое инициализируется при регистрации типа (класса). Макросы приведения типов проверяют значение этого поля, и, если «объект» наследуется от запрошенного типа (в данном случае от GtkMisc), он «настраивается на тип». Если нет, то это выдаст вам ошибку, поэтому, если вы не уверены, вы можете проверить ее с помощью макросов GTK_IS _ * (), например

if (GTK_IS_MISC(label))
    gtk_misc_set_alignment(label);

Что касается второй части вопроса, пробелы перед фигурными скобками являются частью стандартов кодирования команды Gnome, которые, насколько мне известно, получены из стандартов кодирования GNU.

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