Почему -mmacosx-version-min = 10.10 не запрещает использование функции, помеченной как начиная с 10.11?

По моему пониманию, как наличие макросов и -mmacosx-version-min флаг работает, следующий код должен не скомпилироваться при нацеливании на OS X 10.10:

#include <Availability.h>
#include <CoreFoundation/CoreFoundation.h>
#include <Security/Security.h>

#if !defined(__MAC_OS_X_VERSION_MIN_REQUIRED)
#error
#endif

#if __MAC_OS_X_VERSION_MIN_REQUIRED < 101000
#error __MAC_OSX_VERSION_MIN_REQUIRED too low
#endif

#if __MAC_OS_X_VERSION_MIN_REQUIRED > 101000
#error __MAC_OSX_VERSION_MIN_REQUIRED too high
#endif

int main() {

size_t len = 0;

SSLContextRef x{};
auto status = SSLCopyRequestedPeerNameLength(x, &len);
return status != 0;
}

потому что функция SSLCopyRequestedPeerNameLength помечен как доступный в 10.11 в SecureTransport.h:

$ grep -C5 ^SSLCopyRequestedPeerNameLength /System/Library/Frameworks//Security.framework/Headers/SecureTransport.h

/*
* Server Only: obtain the hostname specified by the client in the ServerName extension (SNI)
*/
OSStatus
SSLCopyRequestedPeerNameLength  (SSLContextRef  ctx,
size_t         *peerNameLen)
__OSX_AVAILABLE_STARTING(__MAC_10_11, __IPHONE_9_0);

Тем не менее, когда я компилирую в командной строке -mmacosx-version-min=10.10 Я не получаю никакого предупреждения, несмотря на -Wall -Werror -Wextra:

$ clang++ -Wall -Werror -Wextra ./foo.cpp --std=c++11 -framework Security -mmacosx-version-min=10.10 --stdlib=libc++ ; echo $?
0

Есть ли какое-то дополнительное определение, которое мне нужно предоставить, или специальное предупреждение, чтобы убедиться, что я не выявляю зависимость от API более ранних, чем 10.10? Я действительно ожидал, что -mmacosx-version-min=10.10 будет препятствовать использованию API с тегами с более высокими номерами версий.

Что я здесь не так понял?

Использование XCode 10.0 (10A255) на MacOS 10.13.6 здесь.

5

Решение

Теперь, когда я могу ответить на свой вопрос, я буду: вам нужно добавить -Wunguarded-availability на ваши флаги компиляции. Только тогда вы получите предупреждение / ошибку.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]