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

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

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

//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_POINTER宏时function前的#符号是什么?

  2. TLopen()函数的body在哪里?我有一些 .lib.dll 文件要包含在内。 body 是否可以编译形式存在于这些文件中?

  1. GC_CALLTYPEcalling convention specifier can be (like __stdcall). Can be because don't forget that very easily GC_CALLTYPE can also expand to an empty string. A quick search gave a question where this syntax is discussed here in SO: How to declare an __stdcall function pointer

  2. 的地方
  3. 这称为字符串化:例如,如果相应的宏参数为 xyz,则 #function 将扩展为 "xyz"。更多 here.

  4. 是的,实际上可以。您的 API 会告诉您如何进行编译,以便程序可以找到该函数。这就是拥有图书馆和 linker.

  5. 的全部目的