Using NSProcessInfo from C++

Using NSProcessInfo from C++

本文关键字:C++ from NSProcessInfo Using      更新时间:2023-10-16

可以从C 或C使用[[NSProcessInfo ProcessInfo] promatatingSystemverion]或C,我该怎么做?

在Xcode和Objective-C中,具有扩展名.mm的文件被视为"混合",因为一个文件可以包含C /C概念以及Objective-C代码,并且即使C /C函数实现也可以访问Objective-C类并向他们发送消息。

这样的 .mm -files可以提供蹦床函数,即暴露的c式函数,然后可以在纯C /c-files中使用(扩展.cpp,不得发生目标-C代码,不得发生目标C_3)。

让我们考虑以下设置:

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

让我们从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-stuff。最后,让我们尝试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]));
    }
}