栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

关于C/C++宏定义/预编译

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

关于C/C++宏定义/预编译

1.宏定义在函数内部和外部是一样的(都视为在外部),所以一般不把宏定义放在函数内部以免造成误导;如果一个函数里面只有宏定义 那么该函数相当于不存在。

2.在一个文件或者多个文件中重复定义一个标志编译不会报错,有的编译器会出警告。

3.预编译时对宏定义的处理就是简单的替换,如果说涉及标志重定义的,那么替换时就以最新宏定义为准,关于这点下面作详细说明:

假设现在有a.c,a.h,b.c,b.h四个文件:

1.先在a.h中定义testdef为20,再在b.h中定义testdef为30,然后在a.c中先包含a.h再包含b.h,然后在a.c的main函数中打印

printf("testdef=%dn",testdef);

得到结果为30,因为b.h在a.h后面包含,所以后展开,所以关于testdef的最新宏定义为30;

如果将a.h和b.h的包含顺序反一下则结果也相反。

2.如果b.h先包含,a.h后包含,但是在a.h中包含了b.h,则输出为30,因为在展开a.h的时候又展开了b.h,此时又遇到了testdef的定义为30。

3.在如2的包含顺序中,如果在b.c中定义函数

void testfunc(void)
{
    printf("testdef=%dn",testdef);
}

然后在a.c中调用该函数,此时若b.c中只包含了b.h,则函数输出为30,若既包含了a.h也包含了b.h,则按照上诉包含顺序来定输出;由此可见,宏定义替换只是替换为本文件中最新的定义,并不会联想全局(也没得联想)。

4.如2的条件下,在a.c中如下操作:

int main(void *arg)
{
    printf("testdef=%dn",testdef);
    #define    testdef    40
    printf("testdef=%dn",testdef);

    return 0;
}

则先输出30,再输出40。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/698785.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号