|
14
|
| Daniel LeCheminant · 技术社区 · 17 年前 |
|
|
1
24
试试这个:
如果函数有几个参数,则:
如果函数的参数数目可变,则编译器可能支持所谓的“variadic宏”,如下所示:
我看到在实践中使用这种方法的原因是为了从发布版本中去掉日志记录函数。但是,另请参见 Separate 'debug' and 'release' builds? 在这里人们质疑你 应该 即使 有 不同的版本。 或者,Jonathan对这个答案的评论并没有将函数调用重新定义为Nothing,而是建议您执行如下操作:
这样做的原因是,函数调用总是被编译的(这样它就不会留下诸如对已删除变量的引用之类的无意义的错误),但只在需要时调用:请参阅kernighan&pike The Practice of Programming 还有 Goddard Space Flight Center programming standards .
来自debug.h文件(源自1990年,因此不使用
有了c99,就不再需要双括号技巧了。除非C89兼容性存在问题,否则新代码不应使用它。 |
|
|
2
5
也许一个更简单的方法是有条件地省略函数体?
除非您特别不希望进行函数调用,否则这似乎是实现目标的一种干净方法。 |
|
|
3
3
不幸的是,当前的C++版本不支持变量宏。 但是,您可以这样做:
|
|
|
4
2
如果不希望调用foo,则将其定义为:
对foo()的任何调用都应该是优化的方式。 |
|
|
5
2
沿着这条线做些什么:
您可以这样使用它来记录调试消息:
使用c99可变宏和
以下是使用这些宏的方法:
|
|
|
6
2
很可能,您不想按照建议进行简单的“代码删除”, 因为您的呼叫者将期待 会发生争论。以下是一些麻烦的调用程序片段 应该让你思考:
如果你只是说:
打电话的人所期望的副作用就会消失, 它们的代码会中断,并且很难调试。我喜欢 上面的“sizeof”建议,我也喜欢这样的建议 通过ifdef禁用myfunction()的主体,尽管这意味着 所有调用方都获得相同版本的myFunction()。从你 问题陈述,我想这不是你想要的。 如果确实需要通过上的预处理器定义禁用myfunction()。 基于每个源文件,然后我会这样做:
甚至可以在内部包含noop_MyFunction()的实现 myFunction()的源&头。你也有灵活性 在noop_MyFunction()中添加额外的日志记录或调试信息 好。 |
|
|
7
1
不,C和C++标准说你不能定义一些东西作为评论,所以
不起作用。 |
|
|
8
1
我假设foo是
|
|
|
9
1
我有点不愿意发布这个答案,因为使用宏黑客可以成为问题的根源。然而- 如果 对您希望消失的函数的调用总是单独用于语句中(即,它们从来不是更大表达式的一部分),然后类似以下内容的调用可以工作(它处理varargs):
所以如果你有代码行:
它将在预处理步骤之后作为以下任一步骤结束:
或
它将伪函数的参数列表转换为一组表达式,这些表达式由逗号运算符分隔,而逗号运算符永远不会被计算,因为条件总是返回
这种情况的一个变种类似于Chrisw和Jonathan Leffler的建议:
这有点不同,因为它不需要编译器支持可变宏。(
我认为这对于消除调试跟踪函数调用很有用,这些调用通常不会组合成更大的表达式,但除此之外,我认为这是一种危险的技术。
注意潜在的问题-特别是当调用中的参数产生副作用时(这是宏的一个一般问题-不仅仅是这个黑客)。在示例中,
|
|
|
10
0
如果我记得正确,您应该能够将宏定义为“Nothing”,这将导致编译器忽略该调用。
|
|
11
0
用什么包围每个调用MyFunction?
? |
|
AstralHex · 矩阵乘法代码工作不正常 1 年前 |
|
|
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 1 年前 |
|
|
Die4Toast · 递归调用成员箭头运算符-> 1 年前 |
|
|
Anka Hanım · 关于结构和动态数组地址的问题 1 年前 |