我正在从这里开始学习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 ++要求所有声明都使用类型说明符。
答案 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)