首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在gRPC函数声明之前,空宏“`GRPCAPI`”的作用是什么?

在gRPC函数声明之前,空宏“`GRPCAPI`”的作用是什么?
EN

Stack Overflow用户
提问于 2022-04-07 04:22:18
回答 2查看 70关注 0票数 0

当我阅读gRPC中的代码时,我发现许多API使用GRPCAPI作为限定符。

代码语言:javascript
复制
GRPCAPI grpc_channel* grpc_cronet_secure_channel_create(
    void* engine, const char* target, const grpc_channel_args* args,
    void* reserved);

当我单击指向GRPCAPI的链接时,它是一个空宏。

代码语言:javascript
复制
#ifndef GPRAPI
#define GPRAPI
#endif

#ifndef GRPCAPI
#define GRPCAPI GPRAPI
#endif

我理解空宏的一些用法:

  • 防止包含同一个标头的多个副本
  • 用作调试或删除敏感代码的开关。

但在这里,GRPCAPI不属于任何一个。它仅仅是一个标记来告诉我们函数是一个API吗?还是对文档或其他功能有更大的影响?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-04-08 04:15:46

我非常感谢@Raildex的回答和@paulsm4的评论,它们非常鼓舞人心。

但是GRPCAPIGPRAPI的确切功能被用来标记API为标签。

grpc中有一个名为api.py的脚本,它使用GPRAPI和GRPCAPI标签,这是唯一使用这两个标签的地方。

代码语言:javascript
复制
_RE_API = r'(?:GPRAPI|GRPCAPI|CENSUSAPI)([^;]*);'

for m in re.finditer(_RE_API, text):   # match file content
...

运行脚本后,我们将得到:

代码语言:javascript
复制
...
- arguments: void* engine, const char* target, const grpc_channel_args* args, void*
    reserved
  header: include/grpc/grpc_cronet.h
  name: grpc_cronet_secure_channel_create
  return_type: grpc_channel*
...
票数 0
EN

Stack Overflow用户

发布于 2022-04-07 04:46:11

它要么用于特定于平台的属性,要么用于未来的属性。

对于Windows,通常可以指定

__declspec(dllexport)编译库

__declspec(dllimport)使用库时。

宏是编译和使用宏的方便方法,因为您只在标头中定义宏的值为__declspec(dllexport)/__declspec(dllimport)

其他编译器属性也是如此,例如GCC的__attribute__(visibility(default))/__attribute__(visibility(hidden))

现在,当库被静态链接时,您不需要所有这些,并且定义了没有值的宏。

一个例子是:

代码语言:javascript
复制
#ifdef STATIC_LIBRARY
     #define LIBRARY_API 
#else
#ifdef LIBRARY_EXPORTS
#    define LIBRARY_API __declspec(dllexport)
#else
#    define LIBRARY_API __declspec(dllimport)
#endif


LIBRARY_API void foo(); // when statically linked, it's a simple void function. If dynamically linked, it's either dllexport when compiling the library or dllimport when consuming it.

另一种解释可以是调用约定修饰符。x86 (我只知道x86)有不同的调用约定--这些约定决定了调用方/被调用方如何在程序集级别上处理函数的参数。

就像这样:

代码语言:javascript
复制
#if WIN32
#define APICALL cdecl
#else
#define APICALL 
#endif

APICALL void foo() // uses cdecl on WIN32
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71776309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档