Для чего __ gxx_personality_v0?

Вы получите это сообщение об ошибке в Xcode 7 (Swift 2), если подкласс объявляет соответствие протоколу, который уже унаследован от суперкласса. Пример:

class MyClass : CustomStringConvertible {
    var description: String { return "MyClass" }
}

class Subclass : MyClass, CustomStringConvertible {
    override var description: String { return "Subclass" }
}

Журнал ошибок показывает:

main.swift:10:27: error: redundant conformance of 'Subclass' to protocol 'CustomStringConvertible'
class Subclass : MyClass, CustomStringConvertible {
                          ^
main.swift:10:7: note: 'Subclass' inherits conformance to protocol 'CustomStringConvertible' from superclass here
class Subclass : MyClass, CustomStringConvertible {
      ^

Удаление соответствия протокола из декларации подкласса решает проблему:

class Subclass : MyClass {
    override var description: String { return "Subclass" }
}

Но суперкласс должен объявить соответствие явно, это не будет автоматически выведено из существования свойства description.

97
задан Bruce Johnston 30 November 2008 в 16:53
поделиться

4 ответа

Это используется в стеке unwiding таблицы, которые Вы видите, например, в выводе блока мой ответ на другой вопрос . Как упомянуто на том ответе, его использование определяется C++ ABI Itanium, где это называют Стандартная программа Личности .

причина это "работает" путем определения его, как глобальный ПУСТОЙ пустой указатель, вероятно, потому что ничто не выдает исключение. Когда что-то попытается выдать исключение, тогда Вы будете видеть, что он неправильно себя ведет.

, Конечно, если ничто не использует исключения, можно отключить их с -fno-exceptions (и если ничто не использует RTTI, можно также добавить -fno-rtti). При использовании их Вы имеете к (как другие ответы, уже отмеченные) ссылка с g++ вместо gcc, который добавит -lstdc++ для Вас.

90
ответ дан curiousguy 5 November 2019 в 12:36
поделиться

Обработка исключений включена в бесплатные постоянные реализации.

причина этого состоит в том, что Вы возможно используете gcc для компиляции кода. Если Вы скомпилируете с опцией -###, то Вы заметите, что она пропускает опцию компоновщика -lstdc++, когда она вызывает процесс компоновщика. Компиляция с g++ будет включать ту библиотеку, и таким образом символы, определенные в нем.

11
ответ дан Johannes Schaub - litb 5 November 2019 в 12:36
поделиться

Это - часть обработки исключений. gcc механизм EH позволяет смешивать различные модели EH, и стандартная программа личности вызывается, чтобы определить если соответствие исключения, что завершение вызвать, и т.д. Эта определенная стандартная программа личности для обработки исключения C++ (в противоположность, скажем, gcj/Java обработка исключений).

11
ответ дан Martin v. Löwis 5 November 2019 в 12:36
поделиться

Быстрый grep libstd++ кодовая база показал следующие два использования __gx_personality_v0:

В libsupc ++/unwind-cxx.h

// GNU C++ personality routine, Version 0.                                      
extern "C" _Unwind_Reason_Code __gxx_personality_v0
     (int, _Unwind_Action, _Unwind_Exception_Class,
      struct _Unwind_Exception *, struct _Unwind_Context *);

В libsupc ++/eh_personality.cc

#define PERSONALITY_FUNCTION    __gxx_personality_v0
extern "C" _Unwind_Reason_Code
PERSONALITY_FUNCTION (int version,
                      _Unwind_Action actions,
                      _Unwind_Exception_Class exception_class,
                      struct _Unwind_Exception *ue_header,
                      struct _Unwind_Context *context)
{
  // ... code to handle exceptions and stuff ...
}

(Примечание: это на самом деле немного более сложно, чем это; существует некоторая условная компиляция, которая может изменить некоторые детали).

Так, пока Ваш код на самом деле не использует обработку исключений, определяя символ, поскольку void* ни на что не будет влиять, но как только это делает, Вы собираетесь отказать - __gxx_personality_v0, функция, не, некоторый глобальный объект, таким образом пытаясь вызвать функцию собирается перейти, чтобы обратиться 0 и вызвать segfault.

6
ответ дан Adam Rosenfield 5 November 2019 в 12:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: