![](/img/trans.png)
[英]C++ macro similar to __LINE__ but to find position in the given 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.