问题0.如何在visual studio 2017中新建C项目?
在今天课程之中,视频中的Visual Studio 是2015,所以和我的2017不太匹配;
问题1. #ifdef 的用法?
这个是属于条件编译命令,在谭老书上214页有详细解答,不过我要再次地费曼一下;
条件编译:是希望程序中的一部分内容只在满足某种条件下进行编译;
其格式如下:
#ifdef 标识符
程序段1
#else
程序段2
#endif
简而言之就是,之前有东西被#define命令定义过,那么,就执行程序段1,否则执行程序段2
谭老举出了两种应用方法,我觉得其中一种是比较实用的,就是在调试时对很多的printf();输出语句的控制编译,
#ifdef DEBUG
printf("");
#endif
我们就可以对多个调试型输出进行编译控制,我们最终版本肯定要删除这些调试语句,那么一个一个去删除肯定是不太现实的,我们就采用这种比较高效的方法进行控制,如果之前有一个#define DEBUG ,最终我们调试结束后,只需要把这行语句删去即可;
#ifndef 是某个东西未被定义,就执行程序段1,定义了执行程序段2;
问题3.extern关键字?
extern
extern是计算机语言中的一个关键字,可置于变量或者函数前,以表示变量或者函数的定义在别的文件中。提示编译器遇到此变量或函数时,在其它模块中寻找其定义,另外,extern也可用来进行链接指定。
问题4.extern "C"
百科:
(1)extern
学过C或C++的人都知道,extern是编程语言中的一种属性,它表征了变量、函数等类型的作用域(可见性)属性,是编程语言中的关键字。当进行编译时,该
关键字告诉编译器它所声明的函数和变量等可以在本模块或者文件以及其他模块或文件中使用
。通常,程序员都只是在“*.h”(头文件)中使用该关键字以限定变量或函数等类型的属性,然后在其他模块或本模块中使用,如:
file1.h
1
|
extern
int
i;
|
file2.c /*其他文件调用该变量*/
1
2
3
4
5
|
void
welcome(
void
)
{
if
(i > 0)
printf
(
"Hello World!\n"
);
}
|
(2)“C”
编程语言种类繁多各有优劣,因此在做软件工程时,往往会出现不同语言嵌套或互相调用的情况,例如在C和C++之间就经常出现互相调用。虽然C++是C的超集,但是,它们之间的编译器是不同的,这就产生了各自的编译器在对C和C++进行编译时要依据哪一个作为大家都认可的规范或者约定的问题。很幸运的是,通过一些基础特征我们制定了这样的一个规约,这就是“C”的出处,这些基础特征就是:
1)这种调用编译是一种“超”链接;
2)这种调用编译不能影响现有的编译规范;
3)C++是C的拓展,是C的升华。
根据1),extern关键字可以表达这种“超”链接;根据2)、3)用“C”来规约在C++中对C的编译。
因此,extern "C"表明了一种编译规约,其中extern是关键字属性,“C”表征了编译器链接规范。对于extern "C"可以理解成在C++/C中的
混合编程的编译指令。
明白了这层意思,下面的代码就不难解释了:
1
2
3
4
5
6
7
|
#ifdef __cplusplus /* 如果采用了C++,如下代码使用C编译器 */
extern
"C"
{
/* 如果没有采用C++,顺序预编译 */
#endif
/* 采用C编译器编译的C语言代码段 */
#ifdef __cplusplus /* 结束使用C编译器 */
}
#endif
|