![]() |
1
12
你可以相对容易地写一个宏,它把两个整数相加 二元的 . 例如-将两个4位二进制整数求和的宏:
这个宏可以很容易地扩展为两个8位或16位甚至32位整数的加法。 所以基本上,我们所需要的就是标记连接和替换规则,以实现宏的惊人结果。 编辑: 嗯! |
![]() |
2
12
您可以使用令牌连接来评估基本算法:
但实际上,没有理由这么做,这样做是很愚蠢的(你必须定义大量的宏才能让它发挥更大的作用)。 更明智的做法是将宏扩展为可由编译器计算的整型常量表达式:
编译器将能够计算
|
![]() |
3
5
|
|
4
5
在预处理器中进行有界整数加法是完全可能的。而且,它实际上比人们真正希望的更经常地被需要,也就是说,仅仅拥有它的替代品
现在我们知道如何把加法加到1。
为了增加更大的数字,你需要某种“递归”。
然而,在这方面必须小心。例如,以下操作不起作用。
对于此类技巧的任何扩展使用,Boost预处理器是您的朋友。 |
![]() |
5
4
Boost Preprocessor 库,你可以用预处理器做各种事情,甚至整数 addition . |
![]() |
6
1
C预处理器可以计算包含整数运算的条件。它不会替换算术表达式并将结果传递给编译器,但编译器将对编译时常量的算术进行求值,并将结果发送到二进制文件中,只要您没有重载正在使用的运算符。 |
![]() |
7
1
预处理器宏实际上不能做算术运算,但是可以利用它们来做枚举运算。一般的技巧是让一个宏调用其他宏,并且可以使用其他宏的不同定义重复调用。 例如,类似于: #define MY_THINGS \ a_thing(FRED,4) \ a_thing(GEORGE,6) \ a_thing(HARRY,5) \ a_thing(HERMIONE,8) \ a_thing(RON,3) \ // This line left blank #define a_thing(name,size) EN_##name}; enum {EN_SIZE_##name=(size),EN_BLAH_##name = EN_##name+(size-1), enum {EN_FIRST_THING=0, MY_THINGS EN_TOTAL_SIZE}; #undef a_thing 这将允许一个人为数组中的每件事物“分配”一定数量的空间。数学不是由预处理器完成的,但是枚举仍然被视为编译时常量。 |
![]() |
8
0
我很肯定C/C++预处理器只是复制和粘贴,实际上它并不评估任何表达式。表达式求值由编译器完成。
|
![]() |
SpeakX · 从模板参数类型构造类类型元组 1 年前 |
![]() |
Astor · 简化编译时二进制树类型的创建 1 年前 |
|
Ryan · 更改JS中数字的功能(出于教育目的) 1 年前 |
![]() |
Janilson · 如何解决这种多变的模板歧义 2 年前 |
![]() |
C_Rod · 在模板方法中确定STL容器中项目的数据类型 3 年前 |
![]() |
chenyuandong · Elixir中的元编程 7 年前 |
![]() |
Marcos Felipe · 基于存储的变量进行比较 7 年前 |