c/c++编程心得 -initializer element is not
2015-06-01 12:09
351 查看
原文地址:c编程心得 -initializer element is not constant作者:tencentljp
今天想写一个程序,该程序的主函数为空,但是还可以输出hello world 这句话。
程序是在linux用vim 写的,原程序为:
#include<stdio.h>
int test02()
{
printf("helloworld!n"); //进行输出;
return 0;
}
intg=test02(); //调用函数进行变量的赋初值;
int main()
{
return 0;
}
原以为这么简单的一个程序应该没有啥问题,但是通过gcc进行编译时去报错:initializer element is not constant。想了半天才弄清楚该程序的为啥报错。
全局变量是保存在静态存储区的,因此在编译的时候只能用常量进行初始化,而不能用变量进行初始化。在该程序中是用函数的返回值给变量进行初始化的,因此会出错。
在这里说一下全局变量和局部变量的在编译时的不同的处理方式,在程序编译的时候全局变量必须用常量进行初始化,也就是说直接在全局变量的内存地址直接存储变量的值;对于局部变量则在编译的时候不需要这样,编译的时候只需要将局部变量的赋值语句编译成机器代码,在程序运行到这里是在进行局部变量的赋值。
说了这么多,还是没有说这个问题到底怎么解决。
该问题有一个解决方法就是,可以用g++编译器对该程序进行编译,再碰到这里时,编译器会先把全局变量保存到.bss段中,而且默认值为0,但是会在main函数之前添加一条赋值语句,也就是相当于局部变量进行处理了。
到这里这个问题就完全解决了。
今天想写一个程序,该程序的主函数为空,但是还可以输出hello world 这句话。
程序是在linux用vim 写的,原程序为:
#include<stdio.h>
int test02()
{
printf("helloworld!n"); //进行输出;
return 0;
}
intg=test02(); //调用函数进行变量的赋初值;
int main()
{
return 0;
}
原以为这么简单的一个程序应该没有啥问题,但是通过gcc进行编译时去报错:initializer element is not constant。想了半天才弄清楚该程序的为啥报错。
全局变量是保存在静态存储区的,因此在编译的时候只能用常量进行初始化,而不能用变量进行初始化。在该程序中是用函数的返回值给变量进行初始化的,因此会出错。
在这里说一下全局变量和局部变量的在编译时的不同的处理方式,在程序编译的时候全局变量必须用常量进行初始化,也就是说直接在全局变量的内存地址直接存储变量的值;对于局部变量则在编译的时候不需要这样,编译的时候只需要将局部变量的赋值语句编译成机器代码,在程序运行到这里是在进行局部变量的赋值。
说了这么多,还是没有说这个问题到底怎么解决。
该问题有一个解决方法就是,可以用g++编译器对该程序进行编译,再碰到这里时,编译器会先把全局变量保存到.bss段中,而且默认值为0,但是会在main函数之前添加一条赋值语句,也就是相当于局部变量进行处理了。
到这里这个问题就完全解决了。
相关文章推荐
- C语言scanf函数详解
- C++ 获取窗口句柄
- C语言条件编译及编译预处理阶段
- C++细节1
- C++细节1
- C++11(及现代C++风格)和快速迭代式开发
- Effective C++:条款28:避免返回 handles 指向对象内部成员
- 通过C++的try和catch来捕获SEH异常
- C语言文件读写操作总结
- C语言-动态分配内存对任意个字符串进行排序
- LeetCode || Median of Two Sorted Arrays
- C语言-输入任意个字符串
- C语言-对输入n个字符串进行排序(无导入string.h)
- C语言-对输入的n个字符串进行排序
- C语言 对输入的一个字符串进行排序
- 电子词典的内存分配方式改进
- C++中各种类型的成员变量的初始化方法
- Effective C++ 条款35
- 使用 C++ 处理 JSON 数据交换格式
- ubuntu上调过C语言画简单的函数曲线