首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C预处理器可以执行整数运算吗?

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

Stack Overflow用户
提问于 2009-10-13 13:44:30
回答 6查看 69K关注 0票数 30

正如问题所说,C预处理器能够做到这一点吗?

例如:

#define PI 3.1416
#define OP PI/100
#define OP2 PI%100

有没有办法在预处理阶段计算OP和/或OP2?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-10-13 13:49:37

整数算术?运行以下程序找出答案:

#include "stdio.h"
int main() {
    #if 1 + 1 == 2
        printf("1+1==2\n");
    #endif
    #if 1 + 1 == 3
        printf("1+1==3\n");
    #endif
 }

答案是“是”,有一种方法可以让预处理器执行整数运算,这就是在预处理器条件下使用它。

但是请注意,您的示例不是整型算术。我刚刚检查过了,如果您试图让gcc的预处理器进行浮点比较,它就会失败。我还没有检查这个标准是否允许在预处理器中使用浮点运算。

正则宏展开不计算整数表达式,它将其留给编译器,这可以通过预处理(gcc中的-E)看到以下内容:

#define ONEPLUSONE (1 + 1)
#if ONEPLUSONE == 2
    int i = ONEPLUSONE;
#endif

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

票数 40
EN

Stack Overflow用户

发布于 2009-10-13 13:50:32

你写的代码实际上并不会让预处理器做任何计算。#define进行简单的文本替换,因此定义了:

#define PI 3.1416
#define OP PI/100

这段代码:

if (OP == x) { ... }

变成了

if (3.1416/100 == x) { ... }

然后它会被编译。编译器反过来可以选择采用这样的表达式,并在编译时计算它,并生成与以下内容等效的代码:

if (0.031416 == x) { ... }

但这是编译器,不是预处理器。

为了回答你的问题,是的,预处理器可以做一些算术。这可以在你写下这样的代码时看到:

#if (3.141/100 == 20)
   printf("yo");
#elif (3+3 == 6)
   printf("hey");
#endif
票数 20
EN

Stack Overflow用户

发布于 2009-10-13 13:59:39

是的,我的意思是:它可以做算术:)

99 bottles of beer中所示。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1560357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档