【发布时间】:2012-02-20 09:14:05
【问题描述】:
具体来说,我想写一个宏
1) 允许我设置断点
2) 什么都不做
3) 不会导致编译器警告
#define NO_OP ((void)0)
void main()
{
bool b = true;
if (b)
NO_OP; // I try to set a breakpoint here, but
} // it jumps to here (in Visual Studio 2010)
我也试过
#define NO_OP (assert(1)) // doesn't work
#define NO_OP (sizeof(int)) // doesn't work
#define NO_OP __asm{} // doesn't work
#define NO_OP do {(void)0;} while(0) // warning: conditional is constant
到目前为止,唯一有效的是令人畏惧
#define NO_OP { int x = 0; x = x; }
必须有更好的方法。
编辑
感谢 Blorgbeard,__asm{ nop } 确实有效。但我刚刚意识到任何带大括号的东西都不完美(有问题?),因为它后面会留下一个无用的分号。 (后来)我不知道关于汇编器的深蹲,但我尝试移除大括号,瞧!答案是:__asm nop
谢谢!
为了好奇
这是一个稍微不那么荒谬的例子:
string token = GetNextToken();
if (!Ignore(token))
{
// process token
DoThis(token);
DoThat(token);
}
这段代码是完整的——只要程序正常运行,我就不需要知道关于被忽略标记的任何事情。但是在任何给定时间(并且不更改代码)我想确保我不会拒绝好的令牌
string token = GetNextToken();
if (Ignore(token))
{
NO_OP; // when desired, set breakpoint here to monitor ignored tokens
}
else
{
// process token
DoThis(token);
DoThat(token);
}
【问题讨论】:
-
调试器只能在可以执行某些代码的内存地址上设置断点。由于你没有正在执行的东西,它不能在那里设置断点。也许使用 asm volatile noop 操作码对你有用,但是再一次告诉我们你真正想要解决的问题可能会更好,因为这通常看起来是一种尴尬的方法
-
@PlasmaHH:这就是问题所在,我想要这样一个宏,为了简洁,我只是用一个荒谬的例子。
-
为什么
{int x = 0;}值得畏惧?我的意思是,你只有在 _DEBUG 开启时才把它放在你的代码中,对吧? -
@dog44wgm:“我想要这样一个宏”并不是真正要解决的问题。您希望宏解决某个问题,而谈论 那个 问题以提供真正的解决方案可能更有意义。
-
@Blorgbeard:那(没有大括号)正是我想要的,你能把它放在答案中以便我接受吗?
标签: c++ visual-studio-2010 debugging