【问题标题】:Is it possible to use a macro in function prototypes and definitions?是否可以在函数原型和定义中使用宏?
【发布时间】:2025-12-18 04:15:02
【问题描述】:

我有几个函数共享我想要传递的公共参数,那么是否可以使用宏来避免重复写出公共参数?

作为一个例子,以下是否可行?

#define STD_ARGS arg1, int arg2, int arg3

foo(int STD_ARGS, int foo_arg1, int foo_arg2);
foo(int STD_ARGS, int foo_arg1, int foo_arg2) {
    ...
}

【问题讨论】:

  • 最好将int 吸收到您的STD_ARGS 中,以免以后有人将STD_ARGS 误认为是一种奇怪的one 参数命名方式。如果你绝对必须这样做。在您的编辑器中复制和粘贴的成本不会那么...

标签: c function macros prototype


【解决方案1】:

当然,这是合法的。 #define-d 宏的扩展只不过是替换标记,忽略这些标记的含义(如果有的话)。

(这是否是一个好主意取决于它的文档记录程度、使用范围以及诸如此类的东西。)

【讨论】:

  • 如果我的函数原型是一个单独的头文件,#define 是否必须存在于头文件中?由于头文件与其他 C 文件共享,理想情况下,我希望尽可能保持本地定义。
  • 是的,如果宏在头文件中使用,它应该在该头文件中定义。然后,您可以稍后在同一个标​​头中 #undef 它,以防止标头的用户意外滥用它。
  • 所以我必须#define 同一个宏两次(一次在头文件中[然后用#undef 取消],再一次在源文件中)?我担心如果我更改源中的宏定义但忘记更改标题,反之亦然,这可能会导致代码不一致。
  • @MiloChen,这是我们说这可能是一个坏主意的很大一部分原因。
【解决方案2】:

是的,它有效。 宏的工作只是将STD_ARGS 替换为arg1, int arg2, int arg3。 在编译之前。所以,这是合法的。

【讨论】: