- 编译预变量
- ifndef的方式依赖于宏名字不能冲突,这不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件不会被不小心同时包含。当然,缺点就是如果不同头文件的宏名不小心“撞车”,可能就会导致头文件明明存在,编译器却硬说找不到声明的状况
- pragma once则由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。带来的好处是,你不必再费劲想个宏名了,当然也就不会出现宏名碰撞引发的奇怪问题。对应的缺点就是如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。当然,相比宏名碰撞引发的“找不到声明”的问题,重复包含更容易被发现并修正。
用gcc -S得到程序1的汇编代码
__func__ //当前调试函数
__FILE__ //存放文件名
__LINE__ //当前行号
__DATE__ //编译日期
__TIME__ //编译时间
编译预变量
ifndef的方式依赖于宏名字不能冲突,这不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件不会被不小心同时包含。当然,缺点就是如果不同头文件的宏名不小心“撞车”,可能就会导致头文件明明存在,编译器却硬说找不到声明的状况
pragma once则由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。带来的好处是,你不必再费劲想个宏名了,当然也就不会出现宏名碰撞引发的奇怪问题。对应的缺点就是如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。当然,相比宏名碰撞引发的“找不到声明”的问题,重复包含更容易被发现并修正。
调用模板类出现 undefined reference 错误的解决方法
g++不支持模板类的分离编译,因此模板的实现最好都些在.h文件中,否则将出现undefined reference to XXXX 的错误。下面是一个出错的例子,解决方法就是将stack.cc中的代码移到stack.h中。
宏定义
语句替代:
#define D(a) T<<#a<<endl;a
ofstream T("output.out");
D(int i = 12;)
这里 实际展开就是 : T<<“int i =12 ;”<<endl; int i =12; 两个语句 。a等效于int i = 12;语句
通过这种方法,可以实现执行a语句同时输出执行过程。
main程序入口
程序如何获得输入参数:
在控制台下,输入aa.exe bb.txt 其中bb就作为aa的参数传入
编译器将输入信息放入main函数中,即:int main(int argc,char argv[ ] ){ /……..*/}
其中 argc是参数个数、argv是输入字符串数组
比如这个例子中:
- argc = 2
- argv第一个单元指向字符串”aa.exe”,永远是程序名
- argv第二个单元指向字符串 “bb.txt” ,指向第二个参数名
- argv第三个…
这个赋值传参过程是编译器完成的,程序中只需要调用即可。