使用 define 作为定义 C(++) 的参数
Use define as arguments for define C(++)
我看到自己绊倒了一件小事情,我需要在另一个宏中有一个宏。现在,这不是一个大问题,如果你在实际声明中使用它。但是,我想在参数列表中使用它。
我举个例子:
#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;
是否有可能做这样的事情,如果是的话:如何做?
注意:我知道在这个例子中我可以很容易地使用函数,但是在我的实际程序中使用函数很难,所以我宁愿使用宏。
正如 Olaf 在评论中要求的那样,这是我的实际代码:
#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);
有点不清楚你要求什么,但对于你实际的用例,你根本不使用另一个宏(它实际上被解析为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 预处理器仅为宏提供单遍文本替换处理。
抱歉,宏根本无法以这种方式工作。 不能根据另一个宏来定义一个宏的参数。 您必须像这样编写代码:
#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%
替换为所需的参数名称。
相关文章:
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 如何将定义(#define some_define)作为函数的参数传递
- #define 参数字符串化,但宽字符串 L " instead of "
- 在 #define 中使用模板参数类型
- 井号 #define 函数参数
- 使用 define 作为定义 C(++) 的参数
- #Define & lpCmdLine 参数
- 一元 '*' 的 #define 和无效类型参数(具有 'double')
- #define 函数参数 C++
- Fortran 的参数语句是否与 C/C++ 的 #define 语句相似?
- 宏的参数是否在给定 #define(void)0)的情况下执行?
- 忽略函数名为的define宏的参数
- c++用#define设置默认参数
- 预处理器 #define 带参数,但没有函数体
- 尽管gcc -E输出正确,但#define宏中的无参数函数会导致错误