c++ - 从 C++ 使用 NSProcessInfo

标签 c++ macos cocoa foundation

是否可以使用 [[NSProcessInfo processInfo] operatingSystemVersion]来自 C++ 或 C,我该怎么做?

最佳答案

在 XCode 和 Objective-C 中,扩展名为 .mm 的文件被视为“混合”文件,因为一个文件可以包含 C++/C 概念以及 Objective-C 代码,并且甚至 C++/C 函数实现也可以访问 Objective-C 类并向它们发送消息。

这样的 .mm 文件可以提供一个 trampoline 函数,即公开的 C 风格函数,然后可以在纯 C++/C 文件(扩展名 . cpp,其中不得出现 Objective-C 代码)。

让我们考虑以下设置:

  1. 混合文件 ProcessInfoProvider.mm,它调用 [[NSProcessInfo processInfo] operatingSystemVersion] 并在 C 风格函数 std::string 中提供结果getProcessInfoVersion_C(),
  2. 一个纯 cpp 文件和一个相应的 hpp 文件 UseProcessInfoInC.cpp/hpp 定义了一个类 MyCppProcessInfo,它提供了一个 printVersion()-成员函数,它使用 getProcessInfoVersion_C
  3. 一些其他实例化 MyCppProcessInfo 并调用成员函数 printVersion()
  4. 的文件

让我们从 ProcessInfoProvider.mm 开始:

#import <Foundation/Foundation.h>
#import <Foundation/NSProcessInfo.h>
#include <string.h>
#include <iostream>

std::string getProcessInfoVersion_C (void) {
    NSProcessInfo *processInfo = [[NSProcessInfo alloc] init];

    // check avaiability of the property operatingSystemVersion (10.10+) at runtime
    if ([processInfo respondsToSelector:@selector(operatingSystemVersion)])
    {
        NSOperatingSystemVersion versionObj = [processInfo operatingSystemVersion];

        char version[500];
        snprintf(version, 500, "Version %ld.%ld.%ld",
                 (long)versionObj.majorVersion,
                 (long)versionObj.minorVersion,
                 (long)versionObj.patchVersion);

        return version;
    }
    else
    {
        // Implement fallback for OSX 10.9 and below
        return "?";
    }
}

请注意,getProcessInfoVersion_C 是一个 C 风格的函数,但在其实现中包含 Objective-C 代码。

然后,纯C++文件UseProcessInfoInC.cpp/hpp实现类MyCppProcessInfo:

// UseProcessInfoInC.hpp:
#ifndef UseProcessInfoInC_hpp
#define UseProcessInfoInC_hpp

class MyCppProcessInfo {
public:
    void printVersion(void);
};

#endif /* UseProcessInfoInC_hpp */

// UseProcessInfoInC.cpp:
#include "UseProcessInfoInC.hpp"
#include <iostream>

extern std::string getProcessInfoVersion_C (void);

void MyCppProcessInfo::printVersion(void)
{
    std::string version = getProcessInfoVersion_C();

    std::cout << version;
}

请注意,这两个文件不包含任何 Objective-C 内容。 最后,让我们试试 MyCppProcessInfo,例如在函数 main() 中:

// File main.mm
#import <UIKit/UIKit.h>
#import "AppDelegate.h"

#include "UseProcessInfoInC.hpp"

int main(int argc, char * argv[]) {
    @autoreleasepool {

        MyCppProcessInfo pi;
        pi.printVersion();

        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

关于c++ - 从 C++ 使用 NSProcessInfo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41184989/

相关文章:

c++ - 关键部分总是更快吗?

c++ - 如何禁止在 Windows MFC 应用程序中创建 .pf(预取)文件?

macos - 使 NSTableCellView 可编辑

macos - SMJobBless - 有关何时要求管理员密码的文档

c - libevent 2.0.19 - 奇怪的 evbuffer_copyout 最终 simbols

c++ - 如何使用 Native Wifi API C++ 获取 MAC 地址和 channel 信息

c++ - 多重继承类引用

macos - 用cuda为MAC编译opencv

macos - MRE和MDK安装程序之间的差异

objective-c - 如何在新窗口显示后关闭当前窗口