Thinking in C++【2】C++中的C

1.创建函数

  • 在调用函数时,编译器只是检查参数的类型,使用标识符只是为了方便阅读。因此以下声明函数是可行的。
//函数声明
int translate(float, float, float);
  • func()
    在C++中,意味着该函数有空的参数列表;在C中,意味着不确定的参数数目(这是C的漏洞,因为在这种情况下,不能进行类型检查)。

2.通过库管理器创建自己的库

自己创建的库头文件放置在预处理器搜索路径 中的某处,或者在当前目录中(以便能被 #include “头文件” 发现),或在包含路径中(以便能被**#include <头文件>**发现)。


3.指针

以下定义只说明:ipa是指针,ipb,ipc是普通的int

int* ipa, ipb, ipc;

最好一行定义一个指针

int* ipa;
int* ipb;
int* ipc;

4.按指针传递与按引用传递

  • 按指针传递
void f(int *p) {
    
     *p = 5; }
//在主函数传递变量时,只传递变量的地址
int main() {
    
     f(&x); }
  • 按引用传递
void f( int &r ) 
{
    
     
	r = 5;  //Looks like pass-by-value, but is actually pass by refrence 
}
//在主函数传递变量时,传递的是参数变量对象,在调用函数接收变量时,只是对这个参数进行重命名
int main(){
    
    f(x)}

5.预处理器调试标记与assert宏

  • 预处理器调试
#define DEBUG  //开始调试
//#undef DEBUG  //取消调试
int main(){
    
    
...
#ifdef DEBUG
/* debugging code here */
#endif
...
}
  • assert()宏
    当使用assert()时,给它一个参数,即一个表示断言为的表达式。预处理器产生测试该断言的代码。如果断言不为真,则在发出一个错误信息告诉断言是什么以及它失败之后,程序会终止。

6.函数指针

  • 定义函数指针:
void (*funcPtr)(); 
//*表明这是个指针,()表明这是个指向空参数函数的指针,void表明无返回值
  • 使用函数指针
void func() {
    
    cout << "func() called..";}
int main(){
    
    
	void (*fp)();
	fp = func; //将func的地址传给fp
	(*fp)();
	
}

7.make:管理分段编译

  • ** make**的行为:当输入 make时,make程序在当前目录中寻找名为 makefile 的文件,该文件作为工程文件已经被建立。 makefile 文件列出了源代码文件间的依赖关系
    • 一个名为"hello"的程序的 makefile 文件可能包含:
      hello.exe:  hello.cpp
      	     mycompiler hello.cpp
      
      这就是说hello.exe(目标文件)依赖于hello.cpp,当hello.cpphello.exe文件日期新时,make执行“规则” mycompiler hello.cpp
  • makefile的宏(与C/C++的预处理宏不一样)
CPP = mycompiler
hello.exe: hello.cpp
		$(CPP) hello.cpp

等号“=”用来把CPP定义为一个宏,符号’$‘和圆括号扩展宏。

  • 后缀规则
    后缀规则告诉make可以根据扩展名考虑如何构建程序而不使用显示规则。它指出:“调用下面的命令从扩展名为cpp的文件去构造扩展名为exe的文件”。
CPP = mycompiler
.SUFFIXES: .exe .cpp
.cpp.exe:
		$(CPP) $<

.SUFFIXES指令告诉make必须注意后面的扩展名,**$<**意思是“无论怎样都要触发的规则(有时称为依赖)”

  • 默认目标
CPP = mycompiler
.SUFFIXES: .exe .cpp
.cpp.exe:
		$(CPP) $<
all: target1.exe target2.exe

每次键入make,它会把‘all’作为第一个目标(默认目标),然后发现’all’不存在,所以检查所有的依赖关系。先检查target1.exe并(使用后缀规则)判断:(1)target1.exe文件是否存在,(2)target1.cpp文件是否比target1.exe文件新。若均是,则使用后缀规则。然后再查找下一个目标文件。


8.全局变量的特殊标记

  • //{L} Global2:这是说要创建最后的程序,带有Global2名字的目标文件必须被连接起来(这里没有扩展名是因为目标文件的扩展名在不同的系统中是不一样的)。
  • {O}:意思是“不要从这个文件生成可执行文件,编译它是为了把它连接进一些其他的可执行文件中。”

猜你喜欢

转载自blog.csdn.net/qq_43118572/article/details/112232114
今日推荐