用gcc -S得到程序1的汇编代码

  1. __func__ //当前调试函数
  2. __FILE__ //存放文件名
  3. __LINE__ //当前行号
  4. __DATE__ //编译日期
  5. __TIME__ //编译时间

编译预变量

ifndef的方式依赖于宏名字不能冲突,这不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件不会被不小心同时包含。当然,缺点就是如果不同头文件的宏名不小心“撞车”,可能就会导致头文件明明存在,编译器却硬说找不到声明的状况

pragma once则由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。带来的好处是,你不必再费劲想个宏名了,当然也就不会出现宏名碰撞引发的奇怪问题。对应的缺点就是如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。当然,相比宏名碰撞引发的“找不到声明”的问题,重复包含更容易被发现并修正。

调用模板类出现 undefined reference 错误的解决方法

g++不支持模板类的分离编译,因此模板的实现最好都些在.h文件中,否则将出现undefined reference to XXXX 的错误。下面是一个出错的例子,解决方法就是将stack.cc中的代码移到stack.h中。

宏定义

语句替代:

  1. #define D(a) T<<#a<<endl;a
  2. ofstream T("output.out");
  3. 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第三个…

这个赋值传参过程是编译器完成的,程序中只需要调用即可。