我正在使用一些标准库来开发某些设备的通用接口。 在代码的某些部分我有
//header.h
#ifndef _M_X64
# define GC_CALLTYPE __stdcall
#else
# define GC_CALLTYPE /* default */ //this is my case
#endif
...
typedef int32_t GC_ERROR;
...
/* typedefs for dynamic loading */
#define GC_API_P(function) typedef GC_ERROR( GC_CALLTYPE *function )
GC_API_P(PTLOpen)( TL_HANDLE *phTL );
在我的源文件中
//source1.cpp
TLOpen(&hTl)
//source2.cpp
#define FUNCTION_POINTER(function, ptype, hModule) \
((function) = reinterpret_cast<ptype>(GetProcAddress((hModule), #function))) // What is this #?
GC::PTLOpen TLOpen = 0;
FUNCTION_POINTER(TLOpen, GC::PTLOpen, hModule);
我想找出:
TLopen()
声明?我替换了宏并得到了这个: typedef int32_t( GC_CALLTYPE *PTLOpen )( TL_HANDLE *phTL );
但我学习了不同的函数指针,我期待这样的事情:
typedef int32_t( *PTLOpen )( TL_HANDLE *phTL );
上面的声明仍然是一个函数指针吗?那么GC_CALLTYPE
呢?
在定义#
宏之前,function
之前的FUNCTION_POINTER
符号是什么?
TLopen()
的身体在哪里?我要包含一些.lib
和.dll
个文件。是否可以以编译形式存在于这些文件中?
答案 0 :(得分:1)
__stdcall
位于Joe Duffy说明符所在的位置(如GC_CALLTYPE
)。 可以因为不要忘记非常容易#function
也可以扩展为空字符串。快速搜索提出了一个问题,其中此语法在SO中进行了讨论:calling convention
这称为字符串化:例如,如果相应的宏参数为"xyz"
,xyz
将扩展为{{1}}。更多How to declare an __stdcall function pointer。
是的,它可以,实际上。您的API将告诉您如何进行编译,以便程序可以找到该功能。这是拥有库和here。