预处理器在函数参数中的定义

时间:2015-05-27 07:30:53

标签: c++ c

这是我遇到这种类型代码的第一种类型。我很难理解它。

#ifndef A
#define A
#endif

#ifndef B
#define B
#endif

void funct (structA* A paramA, structB* B paramB){};

参数中预处理器A和B的用途是什么?

2 个答案:

答案 0 :(得分:4)

有关:

#define A this_is_a

预处理器会将A替换为this_is_a

有关:

#define A

预处理器将一无所有地替换A

因此,在您的示例代码中,AB符号将被丢弃。人们有时会使用这种技术来注释代码,例如:

#define IN
#define OUT

现在你可以注释功能参数,显示它们是否是"在"或" out"参数:

void my_function(IN int i, OUT int& x) { ... }

答案 1 :(得分:3)

您可以执行以下操作(假设您的代码位于foo.h):

非const A

#include "foo.h"
...

const A

#define A const
#include "foo.h"

基本上你的代码所做的是它允许在参数中添加一个标志。如果在包含标头时未定义A宏,则它将其定义为空字符串,因此将被忽略。但是,如果定义了宏,则将其值替换为签名。

另一种用法是根据编译器功能选择功能。例如:

#ifdef HAVE_CPP11
# define FORWARD_REF &&
# define FORWARD(T, x) std::forward<T>(x)
#else
# define FORWARD_REF const &
# define FORWARD(T, x) x
#endif

template <typename T>
void function_that_forwards_parameter(T FORWARD_REF t) {
    foo(FORWARD(T, t));
}