C++ 为什么要在C++;
我试图弄清楚人们是如何在工作中使用C++ 为什么要在C++;,c++,C++,我试图弄清楚人们是如何在工作中使用\uuuuuuuuuuuuuuuuuuuuuu宏的。你们是如何使用它的?你们可以使用\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu和来报告源代码中出现的问题 考虑,例如:代码> AsjtType()/Cux>宏——C99标准的措辞,但是C++类似,除了它没有提到“代码> 执行时,如果表达式(应具有标量类型)为false(即, 比较(等于0),assert宏将写入有关该调用的特定
\uuuuuuuuuuuuuuuuuuuuuu
宏的。你们是如何使用它的?你们可以使用\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
和来报告源代码中出现的问题
考虑,例如:代码> AsjtType()/Cux>宏——C99标准的措辞,但是C++类似,除了它没有提到“代码>
执行时,如果表达式(应具有标量类型)为false(即,
比较(等于0),assert宏将写入有关该调用的特定调用的信息
失败(包括参数的文本、源文件的名称、源行
数字和封闭函数的名称-后者分别是
预处理宏
\uuuuuuuuuuuuuuuuuu
和\uuuuuuuu行
以及标识符的
标准错误流的实现定义格式
就这样,
$ cat line.cc
#include <iostream>
int main(void) {
std::cout << "Hello, world from " << __LINE__ << std::endl;
return 0;
}
$ g++ -o line line.cc
$ ./line
Hello, world from 4
$
$cat line.cc
#包括
内部主(空){
标准::cout
它在检测不可容忍条件的CPP宏中特别方便。我为malloc编写了一个包装:
#if DEBUG
#define malloc(s) debugging_malloc(s, __FILE__, __LINE__)
#define free(p) debugging_free(p)
// Also, calloc(), strdup(), realloc() should be wrapped.
#endif // DEBUG
#如果调试
#定义malloc调试
#定义自由(p)调试自由(p)
//此外,还应包装calloc()、strdup()和realloc()。
#endif//DEBUG
在包装器中,根据分配发生的文件和行号跟踪分配。当程序退出时,一个实用程序函数输出一个所有未混合块的列表
如果您使用的是gcc,它还提供了\uuuuu FUNCTION\uuuuu
,这非常好。C99兼容编译器也有\uuuuu FUNCTION\uuuuu
,同样方便。它实际上只是用于调试/记录目的。我很少使用它,因为我更经常依赖gdb之类的调试器
但在输出调试信息时,您始终可以使用它
void dosomething(Object* o)
{
if (!o) {
std::cerr << __FILE__ << ":" << __LINE__ << ": o is NULL!\n";
abort();
}
}
void dosomething(对象*o)
{
如果(!o){
std::cerr只是含糊地引用我头顶上的话:
#define assert(e) ((e) ? (void)0 : printf("Assertion failed %s, %s : %s", #e, __FILE__, __LINE__))
更简单的例子是,当所有其他形式的调试失败时,我偶尔会使用一个宏:
#define GOT_HERE std::cout << "At " __FILE__ ":" << __LINE__ << std::endl
到目前为止,大多数答案都涉及到某种调试代码是使宏在每次调用时都能生成唯一标识符。它使用这些宏为case语句生成标签,这样它就可以跳到您调用的最后一行yield
。特别是一个非常常见的用法是编写ASSERT()宏会报告它们发生的位置以及出错的地方。是的,Aaron-我在添加注释时输入了它!因为printf()
返回一个整数,所以需要移动void强制转换,以便整个表达式始终返回void
。
#define assert(e) ((e) ? (void)0 : printf("Assertion failed %s, %s : %s", #e, __FILE__, __LINE__))
#define GOT_HERE std::cout << "At " __FILE__ ":" << __LINE__ << std::endl