Я строю свое приложение на 10.6, но нацеливаюсь на 10.5 для развертывания.Я хочу воспользоваться API-интерфейсом Service Management SMJobBless, когда программа будет работать на 10.6, но мне, очевидно, все равно нужно будет использовать привилегированный инструмент установщика при работе на 10.5.
Я слабо связан с инфраструктурой Service Managementв моей исполняемой цели.Я пробовал несколько вариантов кода:
if (SMJobBless != NULL) ...
if (SMJobBless) ...
bool const /* or non-const */ useBlessAPI = SMJobBless != NULL;
if (useBlessAPI) ...
И я даже пытался использовать флаги компилятора , перечисленные в похожем вопросе .
10.6, printf("%p %d", SMJobBless, SMJobBless != NULL)
(правильно) печатает ненулевое значение указателя для SMJobBless и 1 для ненулевого.
Когда я копирую комплект приложения в 10.5, printf
говорит мне, что SMJobBless равен 0x0, но(неправильно) печатает 1 для ненулевого указателя.
Единственный способ заставить его работать - это отключение всех оптимизаций и присвоение указателя функции переменной.
Boolean (* const blessAPI) (CFStringRef, CFStringRef, AuthorizationRef, CFErrorRef *) = &SMJobBless;
Но я не могу отключить оптимизацию для производственного кода!