我不能让#ifdef规则至少在Windows(64位)上工作.编译器版本是g ++ 5.4.0我试过:
#ifdef _WIN32
#ifdef _WIN64
#ifdef OS_WINDOWS
Run Code Online (Sandbox Code Playgroud)
我用以下代码编译了以下测试:g ++ main.cpp
即使使用简单的代码:
#include <iostream>
int main()
{
std::cout << "you are on...";
#ifdef _WIN32
std::cout << "Windows" << std::endl;
#elif __linux__
std::cout << "Linux" << std::endl;
#endif
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
"you are on..."
Run Code Online (Sandbox Code Playgroud)
......没有其他任何东西得到满足.
我们有很多用跨平台C++编写的业务逻辑.我们希望为我们的应用程序编写跨平台UI,并使用此业务逻辑来创建整个跨平台应用程序.
是否有可能将纯粹用C++编写的本机模块暴露给本机反应?我们不希望用本机语言(Java或Objective-C)创建C++代码包装器.这样的包装器将增加更多的复杂性,这将使调试和调查更加困难.
背景
我正在开发一个独立于平台(Linux、macOS 和 Windows)的科学成像应用程序,该应用程序实现了各种专业相机,并且这些相机中的每一个都有一个制造商提供的 SDK。我目前正在实施一系列新相机,这些相机由一家公司制造,但由其他制造商使用单独的 SDK 进行品牌推广。
除了 SDK 函数名称的细微差别外,公共接口是相同的。也就是说,一切都一样(函数返回类型和签名等)。唯一的区别是函数名称的开头。
SDK 公共接口示例
int company_1_count_cameras();
bool company_1_init_camera(...);
bool company_1_connect_camera(...);
Run Code Online (Sandbox Code Playgroud)
和:
int company_2_count_cameras();
bool company_2_init_camera(...);
bool company_2_connect_camera(...);
Run Code Online (Sandbox Code Playgroud)
我希望能够为所有 OEM 相机使用一种实现,但要考虑到功能名称的差异。我已经尝试在预处理器定义中使用函数指针,这部分有效。到目前为止,我已经完成了以下工作:
我已将以下内容放入包含文件中:
#define FP( func ) company_2 ## func
Run Code Online (Sandbox Code Playgroud)
在实施中,我做了:
int count = FP(count());
Run Code Online (Sandbox Code Playgroud)
但是,我不确定如何执行此操作,以便我可以编译我的项目以支持所有不同的相机。任何人都可以就实现这一目标的最佳方法提供任何建议吗?
非常感谢阿曼达
我正在尝试将一个项目从 VS2013 升级到 VS2017。除了一件事之外,我一切都在工作 - 调用 printf 时遇到了崩溃。崩溃是这样的:
Unhandled exception at 0x0073910C in exename.exe: An invalid parameter was passed to a function that considers invalid parameters fatal.
exename.exe!_invoke_watson(const wchar_t * expression, const wchar_t * function_name, const wchar_t * file_name, unsigned int line_number, unsigned int reserved) Line 224 C++
exename.exe!_invalid_parameter(const wchar_t * const expression, const wchar_t * const function_name, const wchar_t * const file_name, const unsigned int line_number, const unsigned int reserved) Line 112 C++
exename.exe!_invalid_parameter_noinfo() Line 117 C++
exename.exe!_isatty(int fh) …Run Code Online (Sandbox Code Playgroud)