1.IDE 集成开发环境:指“电子集成驱动器”。是一种辅助程序开发人员开发软件的应用软件。IDE通常包括编程语言编辑器、自动建立工具、通常还包括调试器。有些IDE包含编译器/解释器,如微软的Microsoft Visual Studio,有些则不包含,如Eclipse、SharpDevelop等。
2.预处理指令
预定义符号
__FILE__
进行编译的源文件 用来获取文件名
__LINE__
文件当前的行号 用来获取行号
__DATE__
文件被编译的日期
__TIME__
文件被编译的时间
__STDC__
如果编译器遵循ANSI C(美国标准总局),其值为1,否则未定义
int main()
{
int i=0;
for(i=0;i<10;i++)
{
printf("file:%s,line:%d ",__FILE__,__LINE__,);
printf("time:%s,date:%d ",__TIME__,__DATE__,);
printf("%d\n",__STDC__);
return 0;
}
#define
定义的标识符,在后面不需要加分号,定义的宏后面也不需要加分号
3.#define
定义的宏:允许把参数替换到文本中,
#define NUM 10
#define NUM2 NUM+2
这种情况是允许的
注意:参数列表的左括号必须与name紧邻
如果两者之间有任何空白存在,参数列表就会被解释为stuff的一部分
注意括号
#define
定义的宏不可递归
带有副作用的宏:
#define MAX ((x)>(y))?(x):(y)
int main()
{
int x=5;
int y=8;
int z=MAX(x++,y++)
printf("x=%d y=%d z=%d\n",x,y,z);
return 0;
}
结果为6 10 9
宏与函数的区别
宏:可调试(因为是直接替换) 效率高,检查类型,不够严谨,会有运算符优先级的问题,从而导致程序出错,宏的每次使用均是直接替换,增加了程序的代码长度,注意带有副作用的参数。
函数:可调式(形参是实参的一份临时拷贝) 效率慢,对类型检查比较严格,函数是直接调用,不会出现带有副作用的运算符效果,函数在每次 使用之时,都是进行函数的压栈。
在printf中,有两个字符串,且两个字符串中间没有其他符号,则可合并为一个字符串。
printf("hello""world\n");
printf("hello world\n");
两者等同
#
: 将参数插入到字符串中
#define PRINT(FORMAT,VALUE) printf("the value of"#VALUE" is "FORMAT,VALUE)
##
:把两边的符号连接为一个符号
#define CAT(X,Y) X##Y
int value=10;
printf("%d\n",CAT(value,1));
printf("%d\n",value1);
4.命令行定义
在编译期间,Linux环境下,指定某个 标识符的大小
即 gcc test.c -D SZ=10;
通过命令行,指定变量的大小
5.条件编译
#ifdef
代码
#endif
条件编译的几种情况
情况一:
#if 常量表达式
//.....
#endif
//常量表达式由预处理器求值
如:
#define __DEBUG__ 1
#if __DEBUG__
//...
#endif
情况二:
多个分支的条件编译
#if 常量表达式
//...
#else 常量表达式
//....
#else
//...
#endif
情况三:判断是否被定义
#if defined(symbol)
#ifdef symbol
#if !defined(symbol)
#ifndef symbol
情况四:嵌套指令
#if defined(OS_UNIX)
#ifdef OPTION1
unix_version_option1();
#endif
#ifdef OPTION2
unix_version_option2();
#endif
#elif defined(OS_MSDOS)
#ifdef OPTION2
msdos_version_option2();
#endif
#endif
6.在头文件中:防止头文件被重复引用
#ifndef __TEST_H__
#define __TEST_H__
#endif//__TEST_H__
两个方法相同
#pragma once
7.在引用头文件中<>与“ ”的区别
<>:直接去库里面的头文件去搜索
” “:自己写的头文件,即去当前的工程下去查找自己的头文件,如果没找到,去库里面的头文件去搜索
#include "../test.h"
在上一级的目录下
8.一些预处理指令:#error “ ”目的就是报错
#line 该行号
#pragma()
#pragma comment() 使用静态库
一些屏蔽错误码的预处理:详情请参考C语言深度解剖
环境