Насколько я понимаю, как работают макросы доступности и флаг -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 здесь.