【C语言】相干gcc优化和全局变量的疑惑
【C语言】有关gcc优化和全局变量的疑惑现有文件main.cfun.cfun.h,编译环境ubuntu10.10,gcc-4.4.3。main.c#inc
【C语言】有关gcc优化和全局变量的疑惑
现有文件main.c fun.c fun.h,编译环境ubuntu10.10,gcc-4.4.3。
main.c
#include <stdio.h>
#include "fun.h"
int a;
int main(void)
{
fun();
printf("[main] &a = %p\n", &a);
printf("[main] a = 0x%X\n", a);
}
fun.c
#include <stdio.h>
#include "fun.h"
int a;
void fun(void)
{
a = 0xff;
printf("[fun] &a = %p\n", &a);
printf("[fun] a = 0x%X\n", a);
}
fun.h
#ifndef _FUN__H
#define _FUN__H
void fun(void);
#endif
编译:gcc -o main main.c fun.c(无警告无错)
执行:./main
结果:
[fun] &a = 0x804a01c
[fun] a = 0xFF
[main] &a = 0x804a01c
[main] a = 0xFF
请问:定义了两个全局变量a,为什么在连接的过程中,连接器没有报重复定义的错呢?
ps:我是看了《C陷阱与缺陷》书 “【第4章 连接】 4.2声明与定义”做的实验。
c 优化 c语言 全局变量 gcc
[解决办法]#include <stdio.h>
#include <stdlib.h>
int a= 2;
int a;
int main()
{
printf("%d\n",a);
printf("Hello world!\n");
return 0;
}
可以通过编译
#include <stdio.h>
#include <stdlib.h>
int a;
int a = 2;
int main()
{
printf("%d\n",a);
printf("Hello world!\n");
return 0;
}
也可以通过编译
#include <stdio.h>
#include <stdlib.h>
int a = 5 ;
int a = 4;
int main()
{
printf("%d\n",a);
printf("Hello world!\n");
return 0;
}
错误不可以通过编译
说明int a; 在作为全局变量的时候 只有在用与赋值的时候 才是真正意义上的定义
所以不会报重复定义
[解决办法]要加上 -Wredundant-decls选项才会警告,默认是关闭的:
gcc -Wredundant-decls -o main main.c fun.c
[解决办法]这个应该和GCC参数有关!就像你说的那样,优化了!全局变量都是放在data段中,是容的不得重复的!
[解决办法]一般选离自己最近的变量