c -编译器是否在创建目标代码之前生成隐式转换代码



我在系统中安装了frame -c。

它的作用是,它将我所有的代码转换成更扩展的形式,包含所有C的隐式转换。


(如)//我的实际代码

 if(opTab ==NULL || symTab ==NULL || intermediateFile==NULL || sourceCode ==NULL)
 {
   printf("nError in opening file streams");
   exit(EXIT_FAILURE);
 }

//Frama-c转换代码

 if (opTab == (void *)0) {
    printf((char const   *)"nError in opening file streams");
    exit(1);
  }
  else {
    if (symTab == (void *)0) {
      printf((char const   *)"nError in opening file streams");
      exit(1);
    }
    else {
      if (intermediateFile == (void *)0) {
        printf((char const   *)"nError in opening file streams");
        exit(1);
      }
      else {
        if (sourceCode == (void *)0) {
          printf((char const   *)"nError in opening file streams");
          exit(1);
        }
      }
    }
  }

我的疑问是,在创建对象程序之前,是否C编译器完成所有隐式转换?

在创建对象程序时,这些隐式转换是否并行进行?

它依赖于实现?如果是,为什么?

printf的第一个参数是const char*类型,因此如果在使用printf之前包含<stdio.h>,则编译器将隐式执行转换。(也就是说,在这种情况下不需要强制转换。)

很可能不是。我不熟悉框架- C,但是你看到的转换是源到源的——也就是说,它把C源作为输入,然后给你修改过的C源作为输出。显然,它的工作是使代码更明确和详细。

C编译器通常不会执行这种源转换。(嗯,预处理器可以,但这是不同的。)

它将生成代码来执行所需的任何转换,但它将以机器语言或汇编语言或某种中间形式来完成。

举一个简单的例子:

int n = 42;
double x = n;

在初始化x时执行从int到double的隐式转换,但在编译过程中可能不会创建类似

的文本。
double x = (double)n;

C编译器接受C源代码作为输入。它们通常不会将其作为输出。理论上是可以的,但是他们没有理由这么做。

我是Frama-C开发人员之一。

你所看到的实际上是抽象语法树的文本表示,碰巧是可编译的C代码。正如您所注意到的,许多转换都是显式的。据我们所知,尽管可能会出现bug,但添加这些转换并不会改变程序的意义,因为这些转换是编译器根据C99标准第6.3节(特别是6.3.1.8"常用算术转换")无论如何都会进行的转换。

如果漂亮的打印代码,一旦编译,给出不同的结果,这是一个错误,您可以在Frama-C错误跟踪器上报告。

最新更新