GCC 中的编译器标志 (C)

标签 c gcc gcc4 gcc4.7

我已经阅读了 GCC 文档和 man。 如果我将代码编译为 (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);
}

最佳答案

没有 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);
}

关于GCC 中的编译器标志 (C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52617483/

相关文章:

linux - 为什么静态链接的可执行文件中会有全局偏移表和过程链接表?

C++11 初始化类静态常量数组

c++ - 检查在gcc 4.4.7中没有初始化whter atomic ptr(无nullptr)

c - 在函数 'print_usage' : error: expected ')' before 'PROGRAM' 中

c - C中队列的段错误

linux clone() 函数导致奇怪的编译错误,为什么?

c++ - 如果我尝试在 C++ 中的 catch block 中抛出一些东西,为什么会导致终止

ios - 无法在 Xcode 4.2.1 中构建 openssl

套接字文件描述符可以传递给子进程吗?

c - long double 在使用 MinGW 编译时给出错误的结果