1.预定义符号
在C语言中有一些内置的预定义符号
__FILE__ __LINE__ __DATE__ __TIME__ __STDC__ |
//进行编译的源文件 //文件当前的行号 //文件被编译的日期 //文件被编译的时间 //如果编译器遵循ANSI C,其值为1,否则未定义 |
编译器在__STDC__报错,说明,vs编译器是没有遵循ANSI C的
2.#define
2.1定义标识符
语法:
#define name stuff
我们通常会在一条语句写完后带上分号";",但是在#define定义的时候不要加分号!!!
你看出问题所在了吗?
#define定义的符号是替换的,那么M就会被替换成100;所以加上分号是一件危险的事情.
2.2定义宏
#define 机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏(macro)或定义宏(define macro)。
下面是宏的申明方式:
#define name( parament-list ) stuff
其中的 parament-list 是一个由逗号隔开的符号表,它们可能出现在stuff中
注意:
参数列表的左括号必须与name紧邻。
如果两者之间有任何空白存在,参数列表就会被解释为stuff的一部分
但是宏有个特点,我们先来看段代码.
我们想要的结果是8*8=64,结果输出的却是23,这与我们的预期不符,是为什么呢?
因为宏是替换进去的,此时n = 3+5*3+5,结果自然就是23,所以我们在定义宏的时候需要加括号以保证正确性,不要吝啬括号.
结论:对数值表达式进行求值的宏定义都应该用这种方式加上括号,避免在使用宏时由于参数中的操作符或邻近操作符之间不可预料的相互作用.
2.3#define 替换规则
在程序中扩展#define定义符号和宏时,需要涉及几个步骤。
- 在调用宏时,首先对参数进行检查,看看是否包含任何由#define定义的符号。如果是,它们首先被替换。
- 替换文本随后被插入到程序中原来文本的位置。对于宏