这是我遇到这种类型代码的第一种类型。我很难理解它。
#ifndef A
#define A
#endif
#ifndef B
#define B
#endif
void funct (structA* A paramA, structB* B paramB){};
参数中预处理器A和B的用途是什么?
答案 0 :(得分:4)
有关:
#define A this_is_a
预处理器会将A
替换为this_is_a
。
有关:
#define A
预处理器将一无所有地替换A
。
因此,在您的示例代码中,A
和B
符号将被丢弃。人们有时会使用这种技术来注释代码,例如:
#define IN
#define OUT
现在你可以注释功能参数,显示它们是否是"在"或" out"参数:
void my_function(IN int i, OUT int& x) { ... }
答案 1 :(得分:3)
您可以执行以下操作(假设您的代码位于foo.h
):
#include "foo.h"
...
#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));
}