gpt4 book ai didi

c++ - 为什么 -mmacosx-version-min=10.10 不阻止使用标记为从 10.11 开始的函数?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:42:25 25 4
gpt4 key购买 nike

根据我对可用性宏和 -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;
}

因为函数 SSLCopyRequestedPeerNameLengthSecureTransport.h 中被标记为在 10.11 中可用:

$ 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

我是否需要提供一些额外的定义或特定的警告以确保我不会选择对 10.10 以后的 API 的依赖?我真的期望 -mmacosx-version-min=10.10 会阻止使用标记有更高版本号的 API。

我在这里误解了什么?

在此处使用 macOS 10.13.6 上的 XCode 10.0 (10A255)。

最佳答案

现在我可以回答我自己的问题了,我会:您需要将 -Wunguarded-availability 添加到您的编译标志中。只有这样你才会收到警告/错误。

关于c++ - 为什么 -mmacosx-version-min=10.10 不阻止使用标记为从 10.11 开始的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52977581/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com