首页
社区
课程
招聘
[原创]一个用于C/C++输出编译提示信息的宏
发表于: 2011-3-22 16:37 12215

[原创]一个用于C/C++输出编译提示信息的宏

2011-3-22 16:37
12215

有感于LiuTaoTao的帖子,来一个更实用的宏,而且这个宏更好地诠释了#这个宏操作符。
宏定义及使用见下面的代码:

// cpptest.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
//宏定义
#define _REMIND_ME0(a) #a
#define _REMIND_ME1(a) __FILE__ "(" _REMIND_ME0(a) ") : "
#define REMIND_ME(a) message(_REMIND_ME1(__LINE__)a)

//宏用法
#pragma REMIND_ME("这只是一个空函数,有时间实现它!")
int _tmain(int argc, _TCHAR* argv[])
{
  return 0;
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (16)
雪    币: 1149
活跃值: (888)
能力值: ( LV13,RANK:260 )
在线值:
发帖
回帖
粉丝
2
不懂 望详解。。。。。。lz。。。
2011-3-22 17:32
0
雪    币: 120
活跃值: (160)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3


以前见过在一个子函数中输出hello world..但main函数不调用它。
2011-3-22 17:38
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
4
...就这个?多看点书
2011-3-22 18:20
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
5
哥,就是为了在编译窗口那里打出提示信息,。。。。。
2011-3-22 18:42
0
雪    币: 724
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
没什么大用,只是如果代码编译时有错或警告,双击编译输出对应的错误或警告条目可以跳转到对应的源代码行,如果没有错误,又想在源代码中做个提示标记,这个宏就有用。我有时有些想法暂时不实现或多部分代码要配合时,用它做一标记,以免时间长了自己忘记了,而且关键是可以快速定位相应的代码位置。
2011-3-22 19:43
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
7
有没有用. 要看写得怎么样.
我就写了个简单的


#if !defined(_LWLIB_H)
#define _LWLIB_H

#include <windows.h>

#if defined(_DEBUG)|defined(DEBUG)
#define DBGOUTPUT DebugPrint
#define DBGPRINT(pszName) {int retValue; \
__asm
{ mov retValue, eax} \
int error_code = GetLastError(); \
DebugPrint
("%s", "... start ..."); \
DebugPrint
("call %s", pszName); \
DebugPrint
("return value(hex): %0X", retValue); \
DebugPrint
("error code(hex): %0X", error_code); \
DebugPrint
("from: %s", __FUNCTION__); \
DebugPrint
("file: %s", __FILE__); \
DebugPrint
("line(dec): %d", __LINE__); \
DebugPrint
("%s", "... end ...");}
#else
#define
DBGPRINT
#define DBGOUTPUT
#endif

__inline void WINAPI DebugPrint(LPSTR pszFormat, ...)
{
CHAR szBuffer[10240];
ZeroMemory(szBuffer, sizeof(szBuffer));
va_list arg_list;
va_start(arg_list, pszFormat);
vsprintf_s(szBuffer, _countof(szBuffer), pszFormat, arg_list);
va_end(arg_list);
OutputDebugStringA(szBuffer);
}

#endif // end of _LWLIB_H


用的时候,先把头文件包含进来:
1.
CreateFile(...);
DBGPRINT("CreateFile"); // 监视上面函数的返回值
2.
myFunc()
{
   DBGOUTPUT("Enter myFunc"); // 写点注释什么的...
}


在脱离IDE调试时.可以直接使用 dbgview 查看调试输出.
2011-3-22 20:07
0
雪    币: 437
活跃值: (110)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
8
来看看
2011-3-22 20:14
0
雪    币: 724
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
这是哪和哪啊?
2011-3-22 21:13
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
10
我明白你要表达的了.
我面壁去.
2011-3-22 22:19
0
雪    币: 120
活跃值: (160)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
这么漂亮的代码,好生羡慕。。。但我一点都看不懂啊。。
向大牛学习。。
2011-3-23 02:19
0
雪    币: 29233
活跃值: (7754)
能力值: ( LV15,RANK:3306 )
在线值:
发帖
回帖
粉丝
12
eclipse //TODO 很强大
2011-3-23 03:42
0
雪    币: 724
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
再解释一下吧:
    1.这个宏就是利用#pragma message输出编译信息。
    2.如果仅是输出编译信息,可以直接#pragma message("这只是一个空函数,有时间实现它!"),但此时编译输出中不包括输出这个信息的文件名和行号。
    3.这个宏的主要目的是利用__FILE__和__LINE__这两个编译器译预定义宏和#宏操作符拼出一个格式如下的串:
              文件名(行号) 用户信息
    这样可以标识出信息输出者的位置,更主要的是在VS的IDE中双击这一行可以直接跳到使用宏输出信息的所文件的所在行,就像编译时如果出错了,双击出错信息可以跳到出错位置一样。
    4. “//TODO:”条目在VS中也支持(还可以自定义条目),它会出现在VS IDE的TASK LIST中,但仅限于打开的源文件,不知eclipse是否是这样。而且“//TODO:”只存在于IDE环境中,尽管都有标记代码的作用,但它和编译输出不是一个概念。
2011-3-23 07:25
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
14
eclipse 我不知道. CodeBlocks 可以输出整个项目的 todo. VS 只能是当前文件的.
2011-3-23 09:15
0
雪    币: 29233
活跃值: (7754)
能力值: ( LV15,RANK:3306 )
在线值:
发帖
回帖
粉丝
15
eclipse也是可以查看整个项目的todo
2011-3-23 11:13
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
16
#define _TOSTRING(anything) #anything
#define TOSTRING(anything) _TOSTRING(anything)
#define LINEINFO (__LINE__):
#define _TODO(todo_what) __FILE__ TOSTRING(LINEINFO) TOSTRING(todo_what)
#define TODO(todo) message(_TODO(todo)) 


用的时候:

#pragma TODO(xxx) // xxx 可以是数字, 字符串什么都可以, 不需要加引号.直接写内容就行了.


只能在编译期有效果.而且不能用得太多.否则自己给自己找麻烦.
2011-3-23 14:08
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
17
直接参考天书夜读,定义一个DBGPRINT宏,照样有效
2011-3-29 11:59
0
游客
登录 | 注册 方可回帖
返回
//