江山建设工程信息网站,优化网站关键词排名软件,做网站推广怎样才能省钱,网站备案说明1.#define Ant A虽说做的是将代码中Ant替换成A#xff0c;但是是整体的替换#xff0c;不能将整体分离替换。 不带宏参定义一般形式如下#xff1a; 格式#xff1a; #define 标识符 字符串 其中“标识符”为所定义的宏名#xff0c;“字符串”可以是常数、表达式、格式串…1.#define Ant A虽说做的是将代码中Ant替换成A但是是整体的替换不能将整体分离替换。 不带宏参定义一般形式如下 格式 #define 标识符 字符串 其中“标识符”为所定义的宏名“字符串”可以是常数、表达式、格式串也可以无值。
比如 若有AntB这个表达式Ant作为一个局部整体B也作为一个局部整体所以Ant会被替换成A即AB若有AntaB这个表达式Anta作为一个局部整体B也作为一个局部整体虽说Anta中含有Ant但他为一个整体不会分开替换成AaB。 若要取消宏则#undef Ant
又比如 若有 Ant is animal.这个字符串Ant is animal.作为一个整体所以字符串中的Ant不会被替换成A。
2.带参数define宏函数 带宏参定义一般形式如下 格式#define 标识符(形参列表) 字符串 其中字符串中含有各个形参
若有#define mul(a,b,c,d) abcd 括号中即有a,b,c,d四个形参 假设mul(1,2,3,4)即会替换成1234 表达式得出来的结果为24 但是我们一般引用形参时候都会带括号即 (a)(b)©(d) 为什么呢 这是为了防止逻辑错误#define只是替换并不知道你的逻辑替换后的语句可能因运算符优先级导致逻辑错误。 假设mul(11,2,3,4) 得出来的表达式为11234这样就等于25但实际上我想要的是112然后再223*448。
注意宏名和形参之间不能有空格出现不然预处理器会将mul替换成(a,b,c,d) abc*d。
3.带#字符串化符的define 1若有#define str(a) #a 则str(good)即被替换成字符串good 但#只限用于参数前才会将参数转换成字符串 2若有#define A #a 他不会把A替换成a而是把A替换成#a
4.带##片段连接符的define 若有#define link(num) num##778 则参数num会与778连在一起即##起连接num和778成为一个整体的作用 如str(123)会被替换成123778这个整体
注意在带#或带##的define宏定义执行中不会被其他宏定义给替换掉 如 #define STR1 “aa” #define STR2 “bb” #define STR1STR2 “welcome” #define CAT(STR1,STR2) STR1##STR2 int main() { printf(“%s\n” ,CAT(STR1,STR2)); return 0; } 得到的输出结果为welcome 因为CAT(STR1,STR2)中含##所以执行替换中不会被#define STR1 aa与#define STR2 “bb影响在执行完替换后即STR1STR2其为一整体更不会被aa和“bb”替换只会将整体的STR1STR2给替换成welcome”。
不带#且##的define宏定义宏参数中若包含其他宏那么宏参数在被代入之前会被其他宏替换掉。 又如 #define A(y) X_##y #define B(y) A(y) #define SIZE 1024 #define S SIZE
问A(S)、B(S)分别会被替换成什么
结果A(S)会被X_S替换B(S)会被X_1024替换。 分析 A(S)宏定义中含##故替换过程中不会被其他宏定义替换即不会被#define S SIZE替换所以替换成了X_S而X_S这个整体没有关于他的宏定义所以结果为A(S)会被X_S替换 B(S)宏定义中不含##B(S)故会被替换成A(Size)后被替换成A(1024)最后结果就为X_1024。