Can the C preprocessor perform integer arithmetic?
正如问题所说,C预处理器能做到这一点吗?
例如。:
1 2 3 | #define PI 3.1416 #define OP PI/100 #define OP2 PI%100 |
在预处理阶段,有没有任何方法可以计算op2和/或op2?
整数算术?运行以下程序查找:
1 2 3 4 5 6 7 8 9 10 11 | #include"stdio.h" int main() { #if 1 + 1 == 2 printf("1+1==2 "); #endif #if 1 + 1 == 3 printf("1+1==3 "); #endif } |
答案是"是",有一种方法可以使预处理器执行整数运算,即在预处理器条件下使用它。
但是请注意,您的示例不是整数算术。我刚检查过,如果你尝试让GCC的预处理器进行浮动比较,它会失败。我还没有检查过这个标准是否允许在预处理器中使用浮点运算。
正则宏扩展不计算整数表达式,而是将其留给编译器,如预处理(gcc中的-e)所示,如下所示:
1 2 3 4 | #define ONEPLUSONE (1 + 1) #if ONEPLUSONE == 2 int i = ONEPLUSONE; #endif |
号
结果是
您编写的代码实际上不会使预处理器进行任何计算。a define执行简单的文本替换,因此定义了以下内容:
1 2 | #define PI 3.1416 #define OP PI/100 |
此代码:
1 | if (OP == x) { ... } |
。
变成
1 | if (3.1416/100 == x) { ... } |
然后它被编译。反过来,编译器可以选择获取这样的表达式并在编译时计算它,并生成与此等效的代码:
1 | if (0.031416 == x) { ... } |
。
但这是编译器,而不是预处理器。
为了回答你的问题,是的,预处理器可以做一些算术运算。当你这样写的时候可以看到:
1 2 3 4 5 | #if (3.141/100 == 20) printf("yo"); #elif (3+3 == 6) printf("hey"); #endif |
。
是的,可以用boost预处理器来完成。它与纯C兼容,所以您可以在C程序中仅使用C编译。不过,您的代码涉及浮点数,所以我认为这需要间接完成。
1 2 3 4 5 6 7 8 9 | #include <boost/preprocessor/arithmetic/div.hpp> BOOST_PP_DIV(11, 5) // expands to 2 #define KB 1024 #define HKB BOOST_PP_DIV(A,2) #define REM(A,B) BOOST_PP_SUB(A, BOOST_PP_MUL(B, BOOST_PP_DIV(A,B))) #define RKB REM(KB,2) int div = HKB; int rem = RKB; |
此预处理到(与gcc-s核对)
1 2 | int div = 512; int rem = 0; |
。
多亏了这条线。
是的,我的意思是:它可以做算术。)
如99瓶啤酒所示。
对。
我不敢相信,还没有人与某个模糊的C比赛冠军有关联。这个家伙通过递归includes在预处理器中实现了一个ALU。这里是实现,这里是一些解释。
现在,也就是说,你不想做那个人做的事。这很有趣,但是看看他的提示文件中的编译时间(更不用说结果代码是不可维护的)。更常见的是,人们严格地使用预处理器来替换文本,而对常量整数算法的评估要么在编译时进行,要么在运行时进行。
然而,正如其他人所指出的,您可以在if语句中执行一些算术运算。