搜索
bottom↓
回复: 14

如何宏定义跨文件调用?

[复制链接]

出0入0汤圆

发表于 2010-10-27 19:55:19 | 显示全部楼层 |阅读模式
app.c文件里面有#define APP_TEST_FAULT(err_var, err_code)宏定义,app.c没有对应的app.h头文件;;;;
#define  APP_TEST_ERR(err_var, err_code)          { if ((err_var) != (err_code)) {                                                                \
                                                        APP_TRACE_DBG(("    %s() error #%05d @ line #%05d\n\r", __func__, (err_var), __LINE__)); \
                                                    }                                                                                             \
                                                  }

#define  APP_TEST_FAULT(err_var, err_code)        { APP_TEST_ERR(err_var, err_code); \
                                                    if ((err_var) != (err_code)) {   \
                                                        APP_TASK_STOP();             \
                                                    }                                \
                                                  }

想在另外一个文件NemoTask001.c中使用这个宏定义,该怎么做?NemoTask001.c有NemoTask001.h头文件,,,

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入8汤圆

发表于 2010-10-27 20:02:01 | 显示全部楼层
为什么不弄个头文件呢,既然这个宏定义,多个模块都需要调用,就应该在头文件中声明
或许,你可以单独整个dbg_tool.h之类的
里面一并定义了相关的宏定义,需要的模块,包含该头文件即可。

#define ENABLE_DBG   (1)

#if ENABLE_DBG

#define  APP_TEST_ERR(err_var, err_code)          { if ((err_var) != (err_code)) {                                                                \
                                                        APP_TRACE_DBG(("    %s() error #%05d @ line #%05d\n\r", __func__, (err_var), __LINE__)); \
                                                    }                                                                                             \
                                                  }

#define  APP_TEST_FAULT(err_var, err_code)        { APP_TEST_ERR(err_var, err_code); \
                                                    if ((err_var) != (err_code)) {   \
                                                        APP_TASK_STOP();             \
                                                    }                                \
                                                  }

#else

#define  APP_TEST_ERR(err_var, err_code)        {}
#define  APP_TEST_FAULT(err_var, err_code)      {}

#endif // #if ENABLE_DBG

出0入0汤圆

发表于 2010-10-27 20:43:12 | 显示全部楼层
int main(int argc, char* argv[])
{
        #define FUN(X,Y) (X+Y)
        printf("1+1=%d\n\r",FUN(1,1));
        #undef FUN(X,Y)

        #define FUN(X,Y) (X-Y)
        printf("1-1=%d\n\r",FUN(1,1));
        #undef FUN(X,Y)

        #define FUN(X,Y) (X*Y)
        printf("1*1=%d\n\r",FUN(1,1));
        #undef FUN(X,Y)

        #define FUN(X,Y) (X/Y)
        printf("1/1=%d\n\r",FUN(1,1));
        #undef FUN(X,Y)

        while(1);
}

出0入0汤圆

发表于 2010-10-27 21:18:05 | 显示全部楼层
汗一个头文件都省了……这是什么习惯……是不是ide没有智能提示……

出0入0汤圆

 楼主| 发表于 2010-10-28 12:06:07 | 显示全部楼层
回复【3楼】hemjidn
汗一个头文件都省了……这是什么习惯……是不是ide没有智能提示……
-----------------------------------------------------------------------

呵呵,这个要问BAN和Jean J. Labrosse,,,,,,他把所有的任务创建,任务代码都放在app.c中,我想把自己的任务创建在自己的.c文件中,一个任务一个.c,,,,,,,,,所以有上面的问题,,,,,想问的是,有没有别的办法,不用把哪个宏定义放在某个头文件中,可以做到吗?




/*
*********************************************************************************************************
*                                              EXAMPLE CODE
*
*                              (c) Copyright 2009; Micrium, Inc.; Weston, FL
*
*                   All rights reserved.  Protected by international copyright laws.
*                   Knowledge of the source code may not be used to write a similar
*                   product.  This file may only be used in accordance with a license
*                   and should not be redistributed in any way.
*********************************************************************************************************
*/

/*
*********************************************************************************************************
*
*                                            EXAMPLE CODE
*
*                             LUMINARY MICRO LM3S6965 on the EK-LM3S6965
*
* Filename      : app.c
* Version       : V1.02
* Programmer(s) : BAN
*********************************************************************************************************
*/

出0入42汤圆

发表于 2010-10-28 12:10:40 | 显示全部楼层
宏是直接全局有效的吧

出0入0汤圆

发表于 2010-10-28 13:57:36 | 显示全部楼层
LS请注意,对于多文件工程,没有任何是真正全局有效的。
宏必须通过include来引用
既使是全局变量,也必须通过extern来声明。。。
不然有的编译器给warning有的给error

出0入0汤圆

 楼主| 发表于 2010-10-28 16:13:45 | 显示全部楼层
回复【6楼】snoopyzz
ls请注意,对于多文件工程,没有任何是真正全局有效的。
宏必须通过include来引用
既使是全局变量,也必须通过extern来声明。。。
不然有的编译器给warning有的给error
-----------------------------------------------------------------------

那就是不通过头文件共享宏定义的方法是解决不了这个问题的哦,,,,,,???????

出0入0汤圆

发表于 2010-10-28 22:10:56 | 显示全部楼层
如果你实在不想写头文件的话,只有把你的宏,在每个需要调用它的c文件中都写一遍(copy+paste)。

出0入0汤圆

 楼主| 发表于 2010-10-29 17:06:18 | 显示全部楼层
回复【8楼】John_Lee
如果你实在不想写头文件的话,只有把你的宏,在每个需要调用它的c文件中都写一遍(copy+paste)。
-----------------------------------------------------------------------

上次就是按照COPY+PASTE的方法搞的,结果它说重定义了,刚才试了下,又没有这个问题了,难道CRACKED的IAR就这么阴晴不定的,,,崩溃,,,,,,

出0入0汤圆

发表于 2010-10-29 21:19:15 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-30 08:33:34 | 显示全部楼层
编译器说你重定义,你必然 是重定义了
可能你顺手PASTE到某个被 引用的H文件中了...
或者你习惯不好的include了C文件

出0入0汤圆

 楼主| 发表于 2010-10-30 15:20:08 | 显示全部楼层
回复【11楼】snoopyzz
编译器说你重定义,你必然 是重定义了
可能你顺手paste到某个被 引用的h文件中了...
或者你习惯不好的include了c文件
-----------------------------------------------------------------------

不至于吧,小的再怎么次也不至于include c文件呀。。。。。。。。。。

出0入0汤圆

发表于 2010-10-30 22:57:29 | 显示全部楼层
使用
#ifndef
#define
#endif
防止文件重引用,这样将不会出现重定现象.

有时候,也要使用
#undef
#define
先取消原来已定义的宏,然后重新定义

试试看

出0入0汤圆

 楼主| 发表于 2010-11-1 17:14:41 | 显示全部楼层
回复【13楼】qiu452555846 白羽
使用
#ifndef
#define
#endif
防止文件重引用,这样将不会出现重定现象.
有时候,也要使用
#undef  
#define
先取消原来已定义的宏,然后重新定义
试试看
-----------------------------------------------------------------------

嗯,阿莫论坛里热心的人越来越多了阿,,,,,,,
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-9-28 06:27

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表