gpt4 book ai didi

c++ - 是否可以确定(在运行时)功能是否已实现?

转载 作者:太空狗 更新时间:2023-10-29 20:55:33 25 4
gpt4 key购买 nike

Objective C 的主要特征之一是简单 introspection .此功能的典型用途是能够在调用之前检查某些方法(函数)以确保它确实存在。

而下面的代码在运行时抛出一个错误(虽然它编译很好(Apple LLVM version 7.0.2 (clang-700.1.81) ))...

@import         Foundation;
@interface Maybe : NSObject + (void) maybeNot; @end
@implementation Maybe @end

int main (){ [Maybe maybeNot]; }

通过在调用前添加一个简单的条件...

if ([Maybe respondsToSelector:@selector(maybeNot)])

我们可以等到运行时再决定是否调用该方法。

有什么办法可以用“标准”C (c11) 或 C++ (std=c14)?

即......

extern void callMeIfYouDare();

int main() { /* if (...) */ callMeIfYouDare(); }

我想我还应该提到我正在测试/使用它是在 Darwin 中运行时环境。

最佳答案

在 GNU gcc/Mingw32/Cygwin 上你可以使用 Weak symbol :

#include <stdio.h>

extern void __attribute__((weak)) callMeIfYouDare();

void (*callMePtr)() = &callMeIfYouDare;

int main() {
if (callMePtr) {
printf("Calling...\n");
callMePtr();
} else {
printf("callMeIfYouDare() unresolved\n");
}
}

编译运行:

$ g++ test_undef.cpp -o test_undef.exe

$ ./test_undef.exe
callMeIfYouDare() unresolved

如果您将它与定义 callMeIfYouDare 的库链接,尽管它会调用它。请注意,至少在 Mingw32/Cygwin 中必须通过指针。默认情况下,直接调用 callMeIfYouDare() 将导致截断重定位,除非您想使用链接器脚本,否则这是不可避免的。

使用 Visual Studio,您也许可以让 __declspec(selectany) 执行相同的操作:GCC style weak linking in Visual Studio?

更新 #1:对于 XCode,您可以使用 __attribute__((weak_import)) 代替:Frameworks and Weak Linking

更新 #2:对于基于“Apple LLVM 版本 6.0 (clang-600.0.57)(基于 LLVM 3.5svn)”的 XCode,我设法通过使用以下命令进行编译来解决问题:

g++ test_undef.cpp -undefined dynamic_lookup -o test_undef

并保留 __attribute__((weak)) 与其他平台一样。

关于c++ - 是否可以确定(在运行时)功能是否已实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35425185/

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