这是否仍然声明一种指针函数的别名?

Does this still declare an alias for a type of pointer function?

本文关键字:指针 一种 函数 别名 是否 声明      更新时间:2023-10-16

我正在使用一些标准库来为某些设备开发通用接口。 在我有的代码的某些部分

//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);

我想找出:

  1. 什么是TLopen()声明?我替换了宏并得到了这个:

typedef int32_t( GC_CALLTYPE *PTLOpen )( TL_HANDLE *phTL );

但是我以不同的方式学习了函数指针,我期望这样的东西:

typedef int32_t( *PTLOpen )( TL_HANDLE *phTL );

上面的声明还是函数指针吗?GC_CALLTYPE呢?

  1. 定义宏function之前#符号是什么FUNCTION_POINTER

  2. TLopen()功能的主体在哪里?我有一些.lib.dll文件要包含。正文可以以编译形式存在于这些文件中吗?

  1. GC_CALLTYPE位于调用约定说明符可以位于的位置(如__stdcall)。可能是因为不要忘记,很容易GC_CALLTYPE也可以扩展到空字符串。快速搜索给出了一个问题,其中讨论了 SO:如何声明__stdcall函数指针

  2. 这称为字符串化:例如,如果xyz了相应的宏参数,#function将扩展到"xyz"。更多 这里.

  3. 是的,实际上可以。您的API将告诉您如何进行编译,以便程序可以找到该函数。这就是拥有库和链接器的全部目的。

相关文章: