Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么要在C++;_C++ - Fatal编程技术网

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