A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 阿泽泽 中级黑马   /  2016-5-13 21:47  /  715 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

以下信息整理至<c语言深度解剖>和百度:

3.1.3注释优先与预处理展看
#define BSC//
BSC tesg
结果编译会出错

3.14 用define宏定义表达式
#define SEC_A_YEAR (60*60*24*365)UL
#define SQR(x) ((x)*(x))
#define SUM(x) ((x)+(x))
#define EMPTY
printf("SUM(X)");
#define M 100
A:是,带参数的宏
B:EMPTY没有问题
C:SUM(X)
D:是,不带参数的宏

#define MAX(a,b) ((a)>(b)?(a):(b))
MAX(1+2,value)展开为((1+2)>(value)?(1+2):(value))

3.1.6 #undef 宏定义声明周期结束
#define X 3
#define Y X*2
#undef X
#define X 2
int z = Y;
printf("%d",z);
结果为4

3.6 #pragma预处理、
#define __PRAGMA_MESSAGE__TEST__
#ifdef __PRAGMA_MESSAGE__TEST__
    #pragma message("macao __PRAGMA_MESSAGE__TEST__ has defined")
#endif
pragma message标识的信息会打印出来

#pragma  warning(error:4081)
将警告号4081的改为错误

3.7 #运算符
#define SQR(x) printf("The square of x is %d\n",((x)*(x)));
#define SQR(x) printf("The square of "#x" is %d\n",((x)*(x)));
SQR(10);
结果:The square of 10 is 100

#define FUN1(a) "a"
#define FUN2(a) "#a"
#define FUN3(a) ""#a""

printf("%s\n",FUN1(345));
printf("%s\n",FUN2(345));
printf("%s\n",FUN3(345));
结果a #a 345

3.8 ##运算符
#define XNAME(n) x##n
char string1[] = "XNAME(8)";
printf("%s\n",string1);
结果:x8

others:
#define NAME "zhangyuncong"
printf("%s",NAME);
结果zhangyuncong
printf("%s","NAME");
结果NAME
""内部的不会被宏替换

#define 0x abcd
D:\sean\abc\test\test.cpp(60) : error C2007: #define syntax
定义前面的那个必须是合法的用户标识符

#define NAME "zhang
D:\sean\abc\test\test.cpp(64) : error C2001: newline in constant
宏定义也不是说后面东西随便写,不能把字符串的两个""拆开

也就是说,这种情况下记住:#define第一位置第二位置
(1)不替换程序中字符串里的东西。
(2)第一位置只能是合法的标识符(可以是关键字)
(3)第二位置如果有字符串,必须把""配对。
(4)只替换与第一位置完全相同的标识符
(5)还有就是老生常谈的话:记住这是简单的替换而已,不要在中间计算结果,一定要替换出表达式之后再算

多行宏定义
#define doit(m,n) for(int i=0;i<(n);++i)\
{\
m+=i;\
}

int m = 0,n = 10;
doit(m,n)
printf("%d\n",m);

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马