我正在使用一些标准库来为某些设备开发通用接口。 在我有的代码的某些部分
//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
文件要包含。正文可以以编译形式存在于这些文件中吗?
-
GC_CALLTYPE
位于调用约定说明符可以位于的位置(如__stdcall
)。可能是因为不要忘记,很容易GC_CALLTYPE
也可以扩展到空字符串。快速搜索给出了一个问题,其中讨论了 SO:如何声明__stdcall函数指针 -
这称为字符串化:例如,如果
xyz
了相应的宏参数,#function
将扩展到"xyz"
。更多 这里. -
是的,实际上可以。您的API将告诉您如何进行编译,以便程序可以找到该函数。这就是拥有库和链接器的全部目的。