代码之家  ›  专栏  ›  技术社区  ›  DCR

将C转换为Java理解C中的宏

  •  0
  • DCR  · 技术社区  · 1 年前

    我被告知以下C代码

    #define ADD(a, b) a + b
    
    // example function
    void foo()
    {
      int i = ADD(1, 2); // add two ints
      double d = //doubles
        ADD(3.4, 5.6);
    
      int sly = ADD(1, 2) * 3; // not what it appears to be
    }
    

    转换为此Java代码

    package demo;
    
    public class DemoTranslation {
        public static int add(int a, int b) {
            return a + b;
        }
    
        public static double add(double a, double b) {
            return a + b;
        }
    
        /**
         * example function
         */
        public static void foo() {
            int i = add(1, 2); // add two ints
            double d = /* doubles */ add(3.4, 5.6);
    
            int sly = 1 + 2 * 3; // not what it appears to be
        }
    }
    

    java=7中的1+2*3。C代码是如何产生那个而不是9的?

    1 回复  |  直到 1 年前
        1
  •  10
  •   Eric Postpischil    1 年前

    C宏替换对词法标记进行操作,其级别低于程序的语义分析。

    鉴于 #define ADD(a, b) a + b ,源文本 ADD(1, 2) * 3 被替换为 1 + 2 * 3 ,估计为1+(23)=7。

    宏替换是在早期的原始编程环境中为了方便而创建的。因此,开发它的一些动机只是为了打字方便(编辑源文件在那个时代的硬件中可能是一项繁重的任务),它的其他用途也在增加,包括使用宏来表示简单的表达式。为了解决宏执行词汇替换而不是语义函数的事实,C程序员已经学会了在宏用于表达式时,在宏替换列表以及整个列表中为参数加括号。所以C程序员会定义 ADD 作为:

    #define ADD(a, b) ((a) + (b))
    

    然后 添加(1,2)*3 将由替换 ((1) + (2)) * 3 ,其将被评估为(1+2)3=9。