2015-03-31 30 views
0

我想從__FILE__,__FUNCTION____LINE__預定義宏創建單個字符串。用於預定義宏的Concat

#define LOG_LINE __FILE__ " " __FUNCTION__ " " __LINE__ 

這可能會不工作,因爲編譯器CONCAT不整數這__LINE__是工作。
#define LOG_LINE __FILE__ __FUNCTION__
也不起作用,因爲:
error: expected ';' before '__FUNCTION__'

如何做到這一點有 std::cout << LOG_LINE這將擴大到例如main.cpp main 8

解決方案: #define LOG_LINE __FILE__ << " " << __FUNCTION__不滿足我,因爲有時我想用它作爲字符串(與sstream的大宏也是無效的解決方案;)。

+0

There's沒有整數的概念在'#define'。根本沒有類型。看看'#'和## ## – deviantfan 2015-03-31 07:12:31

+0

是的,沒有整數的概念。但他們是在後。並且編譯器不用int連接字符串,而是用字符串yes連接字符串。爲什麼要看#和##?要得到字符串「'__FILE ____ LINE__'」:)? – senfen 2015-03-31 07:44:14

回答

1

您可以使用以下方法:

#define LOG_LINE (std::string(__FILE__ " ") + __FUNCTION__ + " " + std::to_string(__LINE__)) 

Live example

+0

如果你不介意我的問題,你能解釋一下Senfen開始使用「不滿意」方法有什麼優勢嗎?您可能無法連接創建constexpr字符串所需的值,但我在這裏看不到很多審美區別。它比direct-to-stdout更快,但都可以改進:雙緩衝區瓶頸流;在編譯時儘早彙總大小,並使用一個保留字符串。這不是批評,我只是不能忍受預處理器和編譯器。知道值,但我們需要運行時計算,堆內存等。 – 2017-12-29 04:09:28

+0

@JohnP:它的確可以完全改進爲編譯時C字符串。難點在於'__FUNCTION__'是一個'static const char *'(所以預處理器連接不起作用,所以它需要voodoo模板),而'__FILE__'是一個文字C字符串。 – Jarod42 2017-12-29 10:19:33

+0

那真的是我們開始的地方,不是嗎?我在說有辦法來減輕或減少成本,但這是令人沮喪的,因爲成本似乎是人爲的。從投資回報率的角度考慮它 - 如果您已經確定是您需要優化的地方,那麼您不會因缺乏免費的預處理器功能而被阻止。我無法確定任何其他理由,因此建議您在插入流時添加字符串。我只提出了可變參數sizeof(free,CE)等等,以防性能問題,因爲它不應該是。 – 2017-12-29 13:13:33