首页 > 解决方案 > GCC (C) 中的编译器标志

问题描述

我已阅读 GCC 文档和手册。如果我将代码编译为 (1) gcc -o test test.c 我在执行它时会得到一些结果。如果我将它编译为 (2) gcc -O -o test test.c 我在运行它时会得到不同的结果。

阅读 GCC 手册后,我使用(而不是 -O)该手册中提到的 -O 选项激活的所有选项进行编译。我没有得到与选项 (2) 相同的结果。结果是句子(1)的结果。什么(并且没有记录)改变了生成程序的行为?测试代码:

#include <stdio.h>

int var1 = 0;
int var2 = 0;

int main() {
    int *pntr = &var2;
    pntr--;
    (*pntr) = 99;
    printf("Var1=%d\n",var1);
    printf("Var2=%d\n",var2);
}

标签: cgccgcc4gcc4.7

解决方案


没有UB没有问题

#include <stdio.h>

union 
{
  struct
  {
    int var1;
    int var2;
  };
  int arr[2];
}u;

int main() {
    int *pntr = &u.arr[1];
    pntr--;
    (*pntr) = 99;
    printf("Var1=%d\n",u.var1);
    printf("Var2=%d\n",u.var2);
}

推荐阅读