如何在C ++中将函数作为参数传递给函数宏

时间:2018-09-16 16:05:41

标签: c++

我正在从这里开始学习C ++教程-http://www.cplusplus.com/doc/tutorial/preprocessor/,以了解预处理程序指令

因此,我尝试编写一个简单的函数宏,该宏将接受函数名称作为参数并定义函数,但是我似乎找不到任何有关此操作的示例。

我的尝试如下:

#include<iostream>
using namespace std;

#define FUNCTION_WRAPPER(function) function(int arg1, int arg2) { cout << arg1 * arg2; }

FUNCTION_WRAPPER(multiply);

int main() {
    multiply(1, 2);
    return 0;
}

输出

  

C ++要求所有声明都使用类型说明符。

2 个答案:

答案 0 :(得分:4)

您需要指定函数的类型:

#define FUNCTION_WRAPPER(function) \
    void function(int arg1, int arg2) { cout << arg1 * arg2; }

答案 1 :(得分:2)

宏是简单的文本替换,您可以获取大多数编译器套件,将其视作它们,并为您提供实际的文本扩展。

C编译器的POSIX标准化-E选项有效地做到了这一点(没有它,预处理通常在令牌级别(非文本)进行,与文本预处理相比,这基本上是微优化)。在C ++模式下,gcc和clang也具有-E选项。

考虑到这一点,我认为最好的了解预处理器的方法是在一个窗口中打开源文件,并在另一个窗口中以交互方式预处理文件的监视程序。

file.cc:

#define FUNCTION_WRAPPER(function) function(int arg1, int arg2) { cout << arg1 * arg2; }
FUNCTION_WRAPPER(multiply)

终端:

 watch -n 0.2 gcc -E file.cc

以上内容应为您提供以下预处理器输出:

multiply(int arg1, int arg2) { cout << arg1 * arg2; }

显然,您在函数定义中缺少返回值。

修复:

#define FUNCTION_WRAPPER(function) void function(int arg1, int arg2) { cout << arg1 * arg2; }
FUNCTION_WRAPPER(multiply)