gpt4 book ai didi

c++ - 在 C++ 代码中使用 objc 对象?

转载 作者:行者123 更新时间:2023-11-28 03:05:35 25 4
gpt4 key购买 nike

我有一个名为 Log 的 ObjC 类。在这个类中,我有一个公共(public)静态方法调用错误。

我想从我的 C++ 代码中调用这个方法(如果可能的话:Log::error(string);)。

我在互联网上四处寻找堆栈溢出,但我只找到了这个:

http://philjordan.eu/article/mixing-objective-c-c++-and-objective-c++

还有这个:

Calling Objective-C method from C++ method?(我尝试使用第一种方法,但我不知道如何创建 void *objectiveCObject 变量。)

最佳答案

Log 类的头文件中,您需要提供一个带有 C 链接的回调机制,可以被 C++ 使用,并且您需要防止 C++ 看到 Objective-C 的东西。然后这个头文件可以被 C++ 和 Objective-C 共享。另一种方法是提供单独的头文件和实现文件,仅供 C++ 使用,但这会增加实现的难度。

根据您的评论,我添加了 C++ 可访问方法来创建和销毁 Objective-C Log 对象,但是我确信要使它起作用,您必须使用 MRR 而不是ARC 以便您可以管理生命周期。因此,您需要使用 -fobjc-no-arc 编译 Log.m

日志.h:

#ifdef __OBJC__
#import <Foundation/Foundation.h>
#else // !__OBJC__
#include <stdarg.h>
// And maybe other C++ headers...
#endif // __OBJC__

typedef void *ObjcLog;

#ifdef __cplusplus
extern "C" {
#endif

extern ObjcLog *logCreate(const char *filename);
extern void logDestroy(ObjcLog *logObj);
extern void logInfo(ObjcLog *logObj, const char *msg, ...);
extern void logError(ObjcLog *logObj, const char *msg, ...);

#ifdef __cplusplus
} // extern "C"
#endif

#ifdef __OBJC__
@interface Log : NSObject {
// stuff
}

// Other stuff

@end
#endif // __OBJC__

日志.m:

#import "Log.h"

ObjcLog *logCreate(const char *filename) {
// Assumes [Log initWithFilename:]
Log *log = [[Log alloc] initWithFilename:[NSString stringWithUTF8String:filename]];
return (ObjcLog *)log;
}

void logDestroy(ObjcLog *logObj) {
Log *log = (Log *)logObj;
[log release];
}

void logInfo(ObjcLog *logObj, const char *msg, ...) {
char buffer[8192];
va_list va;
va_start(va, msg);
vsprintf(buffer, msg, va);
va_end(va);

Log *log = (Log *)logObj;
// Assumes [Log info:]
[log info:[NSString stringWithUTF8String:buffer]];
}

void logError(ObjcLog *logObj, const char *msg, ...) {
char buffer[8192];
va_list va;
va_start(va, msg);
vsprintf(buffer, msg, va);
va_end(va);

Log *log = (Log *)context;
// Assumes [Log error:]
[log error:[NSString stringWithUTF8String:buffer]];
}

@implementation Log

...

@end

然后您的 C++ 代码应该能够像这样使用 Objective-C Log 对象:

ObjcLog *logObj = logCreate("/path/to/file.log");
...
logInfo(logObj, "The answer is %d. What is the question?", 42);
...
logDestroy(logObj);

我可能会赞成为 Objective-C 类创建一个 C++ 包装器类,这样可以更轻松地管理对象的生命周期并简化对它的访问。但是,我会避免在此处添加它,因为它可能会使已经过于复杂的事情变得复杂。

关于c++ - 在 C++ 代码中使用 objc 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19830191/

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