我是靠谱客的博主 忧郁板凳,最近开发中收集的这篇文章主要介绍C语言基础之#define #include,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

以下程序的输出为:

#define n(x) x
#define m(x) h(x)
#define h(x) g(x)
#define g(x) #x
#define f(x, y) x##y


int main()
{
    printf("%s,%sn", g(f(1, 2)), h(f(1, 2))); // f(1, 2),12
    //printf("%dn", f(1, 2)); // 12
    //printf("%dn", n(f(1, 2))); // 12
    //printf("%sn", h(f(1, 2))); // 12
    //printf("%sn", n(m(f(1, 2)))); // 12
    //printf("%sn", n(m(f(1, 2)))); // 12

    return 0;
}

#include <stdio.h>
#include "stdio.h"
#include <cstdio>
#include "cstdio"
#include <stdio> //compile error
// 'stdio' file not found

c++使用c的标准库,要么加.h,要么前面加c

C++中特殊的宏定义

 常规用法不再介绍,做如下几点说明和介绍

1. 带参数的宏只完成简单字符替换,之前不做计算实参的工作,如下

#define SUM(x,y) x+y
int a=3,b=2,c=1;
int s;
s=SUM(a+b,b)*SUM(c,b)+c;
结果应该是 s=a+b+b*c+b+c=10。

2. define中的特殊标识符

#define Conn(x,y) x##y
#define ToChar(x) #@x
#define ToString(x) #x

int a=Conn(12,34);
char b=ToChar(a);
char c[]=ToString(a);
结果是 a=1234,b='a',c="1234";

可以看出 ## 是简单的连接符,#@用来给参数加单引号,#用来给参数加双引号即转成字符串。

int aa = Conn(123, 456);
char * bb = Conn("aaa", "bbb");
printf("%dn", aa); // 123456
printf("%sn", bb); // aaabbb

更神奇的是
#define x(s) #s
char *s = x(a   b/**/ c);
char *p = x(a/nb);

结果是*s="a  b  c",*p="a//nb",#s果然很厉害

3.define的多行定义

define可以替代多行的代码

#define MACRO(arg1, arg2) do { 
stmt1; 
stmt2; 
} while(0) 

关键是要在每一个换行的时候加上一个"/" 

由此联想到了C中的关于字符串的一些默认规则

char s1[]="abc"  "efg";
char s2[]="abc"
"efg";
char s3[]="ab
/c";
char s4[]="ab
c";

其中只有s4会产生编译错误,s1="abcefg",s2="abcefg",s3="abc"

4. 宏调用顺序

#define A 3
#define B 4
#define AB 5
#define Conn(x,y) x##y

int a=Conn(A,B);

结果是a=5;可见一个宏的参数是另一个宏,先替换外面的宏,后替换参数。即Conn(A,B)=>AB,后AB=>5

#define AB 5
#define A 3
#define B 4
#define Conn(x,y) x##y
int a=Conn(A,B);

结果也是a=5;

 5.解决重复定义的问题

由于头文件包含可以嵌套,那么C文件就有可能包含多次同一个头文件,就可能出现重复定义的问题的。

通过条件编译开关来避免重复包含(重复定义)

例如

#ifndef __headerfileXXX__

#define __headerfileXXX__

文件内容

#endif

最后

以上就是忧郁板凳为你收集整理的C语言基础之#define #include的全部内容,希望文章能够帮你解决C语言基础之#define #include所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(35)

评论列表共有 0 条评论

立即
投稿
返回
顶部