c++ - 使用 define 作为 define C(++) 的参数

标签 c++ macros

<分区>

我看到自己在一件小事上绊倒了,我需要一个宏在另一个宏中。现在,如果您在实际声明中使用它,这不是什么大问题。但是,我想在参数列表中使用它。

举个例子:

#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 语言预处理器只为宏提供了一次文本替换处理。

关于c++ - 使用 define 作为 define C(++) 的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36071676/

相关文章:

c++ - 初始化指针或引用成员变量以指向另一个成员

c++ - 命中 GDB 断点时自动调用应用程序代码中的函数

c++ - 作为宏参数的范围内的枚举声明

macros - 有没有办法让 Rust 宏像在 C 中一样充当文本替换?

Python Jinja2 宏空白问题

c++ - 如何取消定义 Visual Studio 2012 的系统定义?

casting - 将保留关联映射顺序的 Clojure 宏

c++ - 新版本的c++

c++ - 为什么它停止并以退出代码 11 结束?

c++ - 实例化时为 NULL