Using NSProcessInfo from C++
Using NSProcessInfo from C++
可以从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)。
让我们考虑以下设置:
- 混合文件
ProcessInfoProvider.mm
,该文件调用[[NSProcessInfo processInfo] operatingSystemVersion]
并在C-Style函数std::string getProcessInfoVersion_C()
,
中提供结果 - 纯CPP文件和相应的HPP文件
UseProcessInfoInC.cpp/hpp
定义MyCppProcessInfo
类,该类提供printVersion()
-MEMBER功能,并使用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-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]));
}
}
相关文章:
- 如何解决"invalid conversion from 'char' to 'const char*'"
- std::async from std::async in windows xp
- std::is_reference from std::any
- std::time_point from and to std::string
- "No suitable conversion function from 'std::string' to 'const char *' exists"
- std::chrono::time_point from std::string
- Visual accept std::string from std::byte iterator
- C++中链表的错误"Abort signal from abort(3) (sigabrt) "
- dopen():不以 root 身份运行时"failed to map segment from shared object"
- C++ 中的"template <typename From, typename Tag> struct Alias;"是什么?
- from std::vector to adept::avector
- qt get child (Callout) from QChart
- Webassembly from Javascript
- Generate boost::uuids::uuid from boost::compute::detail::sha
- 什么是"Reading unbounded stream from standard input (Memory Management)"的例子
- Calling C++ dll from python
- 为什么我会收到"invalid conversion from 'Queue*/Stack*' to 'int'"错误消息?
- std::chrono 在从 main 或 from 类方法使用时给出不同的值
- Calling Python Script from Visual Studio C++ Solution
- Access C++ Enum from Swift