Skip to main content
 首页 » 编程设计

c++之将名称(即宏)定义为空

2024年06月20日14exmyth

在使用第三方共享库(即 DLL)时,我必须通过其符号名称来定义可用的函数。所以我必须声明一些函数类型。

但是函数定义涉及调用约定,在我的例子中是__cdecl

所以,自然地,这个调用约定仅适用于 MSVC 编译器,但我仍然想编译我的可移植 API 抽象代码,该代码在 Linux 中使用 boost::dll,即使我无法在我的开发 Linux 机器上执行它,所以我仍然可以检查编译时的东西。

所以我的想法是使用预处理器将 __cdecl 名称定义为空或空白,如果您愿意的话,可以将其定义为 NOP,但我是无法做到这一点:

#if !BOOST_OS_WINDOWS 
#define  __cdecl ( ) /* error, how can I define __cdecl as 'nothing" here? */ 
#endif 
 
#include <boost/dll/import.hpp> 
boost::dll::shared_library lib; 
 
unsigned long device_count(char* pid) { 
    typedef unsigned long(__cdecl func_sig)(char *pvid_id); 
    return lib.get<func_sig>("DLL_Symbol")(pid); 
} 

请您参考如下方法:

#define __cdecl 

再简单不过了!或者更好的是,限制实现保留标识符的传播:

#if BOOST_OS_WINDOWS 
    #define YOURLIB_CDECL __cdecl 
#else 
    #define YOURLIB_CDECL /* nothing */ 
#endif