簡體   English   中英

為什么要在C ++中使用__LINE__宏

[英]Why would you use the __LINE__ macro in C++

我試圖弄清楚人們如何在工作中使用__LINE__宏。 你們是如何使用它的?

您可以使用__LINE____FILE__來報告源代碼中出現問題的位置。

例如,考慮一下assert()宏 - 這個來自C99標准的措辭,但C ++是類似的,除了它沒有提到__func__

當它被執行時,如果表達式(它應具有標量類型)為假(即,比較等於0),則斷言宏寫入有關失敗的特定調用的信息(包括參數的文本,名稱源文件,源行號和封閉函數的名稱 - 后者分別是實現定義格式的標准錯誤流上的預處理宏__FILE____LINE__以及標識符__func__的值。

#define assert(x) (void)(((x)==0)?_Assert(#x,__FILE__,__LINE__,__func__):0)

一個更簡單的例子,這是我在所有其他形式的調試失敗時偶爾使用的宏:

#define GOT_HERE std::cout << "At " __FILE__ ":" << __LINE__ << std::endl

然后,當你的代碼神秘地崩潰並用它取下設備時,你至少可以將這個宏自由地放入源中,希望它能讓你縮小崩潰發生的位置(以及重復之后)。 在實踐中,您可能不會寫入std :: cout,而是使用平台上可用的最低級別,最可靠的字符輸出。

我為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

在包裝器中,根據發生的文件和行號來跟蹤分配。 當程序退出時,實用程序功能輸出任何不同塊的列表。

如果您正在使用gcc,它還會為您提供__FUNCTION__ ,這非常好。 符合C99標准的編譯器也有__func__ ,就像使用方便一樣。

到目前為止,大多數答案都涉及某種調試代碼。 __LINE__ __FILE__ (以及可能的__FILE__ )的另一個用途是使宏在每次調用時生成唯一標識符。 C語言中的協程實現使用這些宏為case語句生成標簽,因此它可以跳轉到您調用yield的最后一行。

像這樣:

$ 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
$
if (something truly impossible has happened) {
   fprintf(stderr, "Value of PI less than 3 detected at %s line %d\n", __FILE__, __LINE__);
}

在CPP宏中檢測無法忍受的條件尤其方便。

它實際上只是用於調試/記錄目的。 我很少使用它,因為我傾向於更頻繁地依賴像gdb這樣的調試器。

但是在輸出調試信息時總是可以使用它。

void dosomething(Object* o)
{
  if (!o) {
    std::cerr << __FILE__ << ":" << __LINE__ << ": o is NULL!\n";
    abort();
  }
}

只是模糊地引用我的頭腦:

#define assert(e)       ((e) ? (void)0 : printf("Assertion failed %s, %s : %s", #e, __FILE__, __LINE__))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM