其他分享
首页 > 其他分享> > 从C使用NSProcessInfo

从C使用NSProcessInfo

作者:互联网

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

解决方法:

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

这样的.mm文件可以提供蹦床功能,即公开的C样式功能,然后可以在纯C/C++文件中使用(扩展名.cpp,其中不得出现Objective-C代码).

让我们考虑以下设置:

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

让我们从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]));
    }
}

标签:foundation,c,macos,cocoa
来源: https://codeday.me/bug/20191012/1900542.html