预处理器#define带参数,但没有函数体

时间:2014-05-08 20:32:36

标签: c++ c-preprocessor

所以我想知道#define foo(bar)是做什么的。它似乎有一个论点,但没有身体。让我给你一些背景信息:

定义

#ifndef __success
    #define __nvapi_success
    #define __success(epxr)
#endif

用法

#define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl

最后,NVAPI_INTERFACE用于函数声明,如下所示:

NVAPI_INTERFACE NvAPI_Initialize();

这一切都取自我试图弄清楚的NVAPI Nvidia's Core SDK

1 个答案:

答案 0 :(得分:2)

一个带有"没有身体"的宏(没有替换列表)只有正文。这意味着每一次"调用"该代码中的宏将被替换为一个标记序列,即对该宏的引用将消失而没有任何影响。

在上面的示例中,代码的作者只是希望__success(epxr)的所有调用在某些情况下从代码中消失(即,如果先前未定义__success)。这就是它的全部内容。

__nvapi_success宏也是如此。即你的宏是否有参数在这方面没有任何区别。

在某些其他情况下,此宏可能会以不同的方式定义,非空替换列表。如果您查看其余的源代码,您可能会发现以不同方式定义__success(epxr)的其他位置以及发生这种情况的条件。