预处理器c++的工作
Working of pre-processor C++
#define NAME VALUE
我知道无论何时编译器看到这个,它都会用VALUE替换NAME。但是我对预处理指令的工作感到困惑,例如:
#define CONFIG_VAR(name, type, value)
这并没有告诉编译器替换任何东西,但是我可以看到像
这样的语句CONFIG_VAR(rank, int, 100)
可以成功编译。这是如何工作的呢?
在您的示例中,这根本不会做任何事情。任何参数,即使是那些看起来应该导致编译错误的参数,都被接受,并且整个宏调用将被替换为空字符串。
但是,如果您稍后将定义替换为如下内容:
#define CONFIG_VAR(name, type, value) add_config_var<type>(name, value)
它会突然做一些有用的事情。所以,我猜宏是一个占位符,用于在该部分程序中尚未实现或不可用的功能。
当你说:
#define FOO BAR
预处理器所做的是在每次看到文本 FOO
之后替换为文本BAR
,这是一个宏定义。这个过程称为宏扩展。这主要用于定义常量,如:
#define N 128
#define MASK (~(1 << 4))
它可以被(ab)用来做非常奇怪的事情,因为它不知道表达式、语句或任何东西。所以:
#define CONST (1 + 3 << (x))
实际上是可以的,并且每次看到它都会扩展为(1 + 3 << (x))
, 每次使用x
的当前值。还有像这样的垃圾:
#define START 5 * (1 +
#define END + 5)
后接START 2 + 3 + 4 END
可预见地得到5 * (1 + 2 + 3 + 4 +
5) '
还可以使用参数定义宏,例如: ,如果调用为 这来自于C的黑暗时代,今天的C/c++有更安全/更干净的机制来获得相同的结果(在c++中使用#define BAD_SQUARE(x) x * x
BAD_SQUARE(a)
,则扩展为a * a
。但是BAD_SQUARE(a + b)
扩展到a + b * a + b
,这不是我们想要的(大概是…)。const
,在C中它可悲地定义了一个变量,而不是一个真正的常量;使用C/c++中的内联函数或c++中的模板)。有太多的代码使用这种预处理器的用法(有太多的手指这样写),所以几乎不可能摆脱它。作为一个经验法则,学习使用宏读取代码,同时学习不使用宏编写代码(在合理的情况下,有时它们非常方便…)。
这是一个宏(在C中比c++中更常见)。根据您提供的定义,预处理器将删除该"函数"的出现。一个常见的用例通常是用于日志记录:
#ifdef DEBUG
#define dprintf(...) printf(...)
#else
#define dprintf(...) // This will remove dprintf lines
#endif
在c++中,我相信一般的约定是使用内联函数,因为它们在性能方面提供相同的值,但也进行类型检查。
如果这确实是整个宏定义,那么它只需定义这个类函数的宏来展开为nothing(一个空字符串)。例如,在源代码中,
CONFIG_VAR(rank, int, 100);
将被转换成
;
在这种情况下,预处理程序只是删除这些字符串(不替换)。足够广泛使用的技术
这里有一个很重要的例子(实际上只有一种可能的用法):
#if DEBUG_ON
#define LOG(level, string) SomeLogger(level, string)
#else
#define LOG(level, string)
#endif
也许你应该更熟悉C预处理器。
有一些类似的技术(X宏),它构建代码来处理基于定义动作的重复列表。
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 链表c++插入,所有情况都已检查,但没有任何工作
- 为什么stream::忽略未按预期工作