我发现自己在一个小东西上磕磕绊绊,我需要在另一个宏中使用宏。现在,如果您在实际声明中使用它,这不是一个大问题。但是,我想在参数列表中使用它。
让我举个例子:
#include <iostream>
#include <string>
#define ARGUMENTS first_name, middle_name, last_name
#define GREET(ARGUMENTS) "Hello " << first_name << " " << middle_name << " " << last_name
int main() {
std::cout << GREET("Stack", "Over", "flow") << std::endl;
}
如果我用g ++ 5.2.1编译它,我会收到这个错误:
test.cpp:8:44: error: macro "GREET" passed 3 arguments, but takes just 1
std::cout << GREET("Stack", "Over", "flow") << std::endl;
是否可以做这样的事情,如果是这样的话:怎么做?
NB:我知道在这个例子中我可以轻松使用一个函数,但在我的实际程序中使用函数很难,所以我宁愿使用宏。
正如奥拉夫在评论中所要求的,这是我的实际代码:
#define B0123 b0, b1, b2, b3
#define fill(A, B0123) A[0]=b0; A[1]=b1; A[2]=b2; A[3]=b3;
#define comp(A, B0123) (A[0]==b0 && A[1]==b1 && A[2]==b2 && A[3]==b3)
#define transferarr(dir, index, data) bytes = libusb_control_transfer( handle, dir, 64, 0, index, data, 4, 0 );
#define transfer(dir, index, B0123) fill(data, B0123); transferarr(dir, index, data);
#define T_OUT 0x40
#define transferout(index, B0123) transfer(T_OUT, index, B0123)
#define STATE_ONE 0xcc, 0x00, 0x00, 0x8f
#define STATE_TWO 0xcd, 0x20, 0x00, 0x10
transferout(32800, STATE_ONE);
transferout(32800, STATE_TWO);
答案 0 :(得分:2)
有点不清楚你要求的是什么,但对于你的实际用例,你根本就不使用另一个宏(实际上它被解析为GREET()
的参数名称),但声明参数根据需要:
// Nope: #define ARGUMENTS first_name, middle_name, last_name
#define GREET(first_name, middle_name, last_name) "Hello " << first_name << " " << middle_name << " " << last_name
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
请记住,C预处理器只为宏提供单通道文本替换处理。
答案 1 :(得分:1)
抱歉,但宏根本不起作用。您无法根据另一个宏定义一个宏的参数。你必须改为编写代码:
#include <iostream>
#include <string>
#define GREET(first_name, middle_name, last_name) "Hello " << first_name << " " << middle_name << " " << last_name
int main() {
std::cout << GREET("Stack", "Over", "flow") << std::endl;
}
要做你想要的事,你将不得不做更多这样的事情:
#include <iostream>
#include <string>
#define GREET(%MYARGUMENTS%) "Hello " << first_name << " " << middle_name << " " << last_name
int main() {
std::cout << GREET("Stack", "Over", "flow") << std::endl;
}
然后使用外部工具预处理代码文件,该工具可以在编译结果代码之前用所需的参数名替换%MYARGUMENTS%
。