Вы получите это сообщение об ошибке в 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
.
Это используется в стеке unwiding таблицы, которые Вы видите, например, в выводе блока мой ответ на другой вопрос . Как упомянуто на том ответе, его использование определяется C++ ABI Itanium, где это называют Стандартная программа Личности .
причина это "работает" путем определения его, как глобальный ПУСТОЙ пустой указатель, вероятно, потому что ничто не выдает исключение. Когда что-то попытается выдать исключение, тогда Вы будете видеть, что он неправильно себя ведет.
, Конечно, если ничто не использует исключения, можно отключить их с -fno-exceptions
(и если ничто не использует RTTI, можно также добавить -fno-rtti
). При использовании их Вы имеете к (как другие ответы, уже отмеченные) ссылка с g++
вместо gcc
, который добавит -lstdc++
для Вас.
Обработка исключений включена в бесплатные постоянные реализации.
причина этого состоит в том, что Вы возможно используете gcc
для компиляции кода. Если Вы скомпилируете с опцией -###
, то Вы заметите, что она пропускает опцию компоновщика -lstdc++
, когда она вызывает процесс компоновщика. Компиляция с g++
будет включать ту библиотеку, и таким образом символы, определенные в нем.
Это - часть обработки исключений. gcc механизм EH позволяет смешивать различные модели EH, и стандартная программа личности вызывается, чтобы определить если соответствие исключения, что завершение вызвать, и т.д. Эта определенная стандартная программа личности для обработки исключения C++ (в противоположность, скажем, gcj/Java обработка исключений).
Быстрый 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.