Все, что вы описываете, звучит так, чтобы соответствовать цели функции языковой привязки.
Члены класса специально исключены из "C"
языковой привязки. Согласно примерам в стандарте (C++11 §7.5/4), типы указателей функций в объявлениях членов класса, объявлениях extern
в любом контексте и объявлениях всех других функций наследуют окружающий блок extern "C" {}
. Вы определяете языковую связь помимо "C"
, но было бы менее удивительно следовать ее примеру, возможно, с дополнительным сопоставлением между this
и self
.
Требования открыты, согласно §7.5/2:
Использование строкового литерала, отличного от "C" или "C++", поддерживается условно, с семантикой, определяемой реализацией. [Примечание: поэтому спецификация связи со строковым литералом, который неизвестен реализации, требует диагностики. — end note ] [Примечание: рекомендуется брать написание строкового литерала из документа, определяющего этот язык. Например, Ада (не АДА) и Фортран или ФОРТРАН, в зависимости от урожая. — примечание в конце]
Вы можете переключиться на совершенно другой язык в фигурных скобках, и все будет в порядке. (Хотя с точки зрения грамматики все должно анализироваться как declaration C++ или declaration-seq.)
Однако в соответствии с этим вы должны использовать extern "Objective-C"
с дефисом, поскольку окончательное название документа — «Язык программирования Objective-C».
EDIT: Безусловно, вызов через objc_msgSend
не влияет ни на что, указанное в стандарте. Нигде не сказано, как вызываются функции C++. Добавленная промежуточная функция - это просто инструкции машинного уровня, выходящие за рамки языковой семантики, и ничем не отличаются от специальных инструкций, используемых для вызова Pascal, Fortran и т. д., например. путем изменения порядка параметров в стеке. Я не хочу сравнивать вашу схему с «переключением на совершенно другой язык в фигурных скобках», просто чтобы подчеркнуть, что запаса хватает.
Взяв в качестве примера спецификацию extern "C"
в стандарте, она ломает много вещей, коренным образом изменяя правило ODR, потому что C не обязан поддерживать какое-либо искажение. Таким образом, ваша схема может нарушить как минимум столько.
person
Potatoswatter
schedule
31.01.2013