C预处理器可以执行整数运算吗?

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

结果是int i = (1 + 1);(加上一些可能表示源文件名和行号的东西,等等)。


您编写的代码实际上不会使预处理器进行任何计算。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语句中执行一些算术运算。