亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(biāo)題: 請問如何將指定字符串動態(tài)定義為宏 [打印本頁]

作者: xhx321    時(shí)間: 2016-04-15 12:21
標(biāo)題: 請問如何將指定字符串動態(tài)定義為宏
本帖最后由 xhx321 于 2016-04-18 12:17 編輯


貌似原來的描述把問題寫的很亂, 也沒表述清楚需求及重點(diǎn)。在這里重新寫一下:
需要實(shí)現(xiàn)一個(gè)宏定義:O_PRINT_NAME_REGISTER(DEBUG_STRING_NAME)
例如:

************ 1.C ***********
O_PRINT_NAME_REGISTER(NET_TRACE)
O_PRINT_NAME_REGISTER(MAIN_TRACE)

void example(void)
{
     NET_TRACE(" net log");  // LINE 20
     MAIN_TRACE(" main log") // LINE 21
}

******* output *******
example - 20: net log
example - 21: main log

請注意需要能正確顯示調(diào)用的行號和函數(shù)名。
請問如何實(shí)現(xiàn)上面這個(gè)宏 O_PRINT_NAME_REGISTER ?
作者: cokeboL    時(shí)間: 2016-04-15 14:11
只看標(biāo)題的話我想說:你都動態(tài)了還扯什么宏

瞄了一眼需求我想說:那叫tag,你加個(gè)tag參數(shù)不就行了
作者: xhx321    時(shí)間: 2016-04-15 15:20
大神or牛人,表歪樓,如果認(rèn)為很簡單,請把后面實(shí)現(xiàn)了

#define O_PRINT_NAME_REGISTER(string, level ) ?

回復(fù) 2# cokeboL


   
作者: windoze    時(shí)間: 2016-04-15 15:56

  1. struct printer {
  2.     printer(int l) : level(l) {}
  3.     void operator()(const char *msg) const { if(level >= g_print_level) std::cout << msg << std::endl; }
  4.     const int level=0;
  5. };

  6. #define O_PRINT_NAME_REGISTER(name, level) const printer name(level)
復(fù)制代碼
差不多是這么個(gè)東西?
作者: cokeboL    時(shí)間: 2016-04-15 16:17
我沒歪樓,也沒認(rèn)為簡單,我的意思是,不要對語法的追求過于妖魔化,單看為了實(shí)現(xiàn)幾個(gè)打印函數(shù)的需求,很簡單,你寫個(gè)有幾個(gè)參數(shù)的函數(shù)或者幾個(gè)不同的函數(shù)
就搞定的事情,非要追求宏來生成,是不是有點(diǎn)舍本求末了?

碼農(nóng)最大的悲哀是該產(chǎn)品導(dǎo)向的場景,非要語言語法導(dǎo)向,費(fèi)力不討好,除了看上去語法牛逼不容易看懂,然并卵。
作者: cokeboL    時(shí)間: 2016-04-15 16:27
老是看見有人問奇葩的語法,普通點(diǎn)的正常點(diǎn)的寫法都能實(shí)現(xiàn),所以這種需求我總結(jié)就三種原因:
一是非要追求奇葩才顯得逼格高
二是舍本求末沒把用代碼實(shí)現(xiàn)需求和用語法實(shí)現(xiàn)代碼的重要性搞明白
三是想研究語法出于興趣愛好
當(dāng)然還有一種可能是上面這三種原因可能占不止一條

第三種值得鼓勵(lì),但是也別太迷戀了,其他情況,不鼓勵(lì)
作者: cokeboL    時(shí)間: 2016-04-15 16:34
回復(fù) 4# windoze


    .c文件,沒說支持c++哇。。
作者: windoze    時(shí)間: 2016-04-15 20:42
回復(fù) 7# cokeboL

我當(dāng)然不可能給他一個(gè)C的,你知道我從來不代做作業(yè)。
作者: xhx321    時(shí)間: 2016-04-16 10:06
本帖最后由 xhx321 于 2016-04-16 11:21 編輯

謝謝版主的回復(fù),因?yàn)槭荂++的寫法,我不是特別懂。請問
在這種方案下,O_DEBUG其實(shí)是被轉(zhuǎn)成的函數(shù)調(diào)用么?如果是函數(shù)調(diào)用,怎么解決行號打印的問題?
例如: 在code里是這樣引用的
void main(void)
{
            O_DEBUG(" print level 0 for O_DEBUG");  // LINE 20
}
希望ouput時(shí)能打印出,O_DEBUG被引用的行號20:
        main - 20 : print level 0 for O_DEBUG

另外解釋一下,我手上有一個(gè)和您類似的C方案, 但是暫時(shí)無法解決行號打印的問題,同時(shí)想看看有沒有不用函數(shù)的方法,才跑到這提問題,不是想來抄作業(yè)的。

@cokeboL:
        1. 標(biāo)題描述的“動態(tài)定義宏”,是對預(yù)編譯,預(yù)處理而言的,動態(tài)與宏并不矛盾。
        2. 當(dāng)別人提問時(shí),如果解決不了就當(dāng)學(xué)生好了,能不能別說別人不該做這個(gè)事情,然后瞎指導(dǎo)一通。個(gè)人認(rèn)為這里是技術(shù)論壇,不需要來刷存在感。
        3. 我提這個(gè)問題是有自己的需求,不需要玩什么高深技術(shù)。


回復(fù) 8# windoze


   
作者: yulihua49    時(shí)間: 2016-04-18 10:17
本帖最后由 yulihua49 于 2016-04-18 10:25 編輯
xhx321 發(fā)表于 2016-04-15 12:21
想實(shí)現(xiàn)這樣的功能。在一個(gè).c里有多個(gè)管理打印的宏。例如:O_DEBUG, O_TRACE,O_ERROR,各自有其打印的級別l ...

你看這個(gè)行嗎?


  1. int ShowLog(int DEBUG_level,const char *fmt,...);

  2. #define EMASS_LOG_DEBUG (5)
  3. #define EMASS_LOG_VERBOSE (4)
  4. #define EMASS_LOG_INFO (3)
  5. #define EMASS_LOG_WARN (2)
  6. #define EMASS_LOG_ERROR (1)

  7. #define EMAS_DEBUG(fmt, arg...) ShowLog(EMASS_LOG_DEBUG, "[D][T:%lx] %s(%d) "fmt, pthread_self(), __FILE__, __LINE__, ##arg)
  8. #define EMAS_VERBOSE(fmt, arg...) ShowLog(EMASS_LOG_VERBOSE, "[V][T:%lx] %s(%d) "fmt, pthread_self(), __FILE__, __LINE__, ##arg)
  9. #define EMAS_INFO(fmt, arg...) ShowLog(EMASS_LOG_INFO, "[I][T:%lx] %s(%d) "fmt, pthread_self(), __FILE__, __LINE__, ##arg)
  10. #define EMAS_WARN(fmt, arg...) ShowLog(EMASS_LOG_WARN, "[W][T:%lx] %s(%d) "fmt, pthread_self(), __FILE__, __LINE__, ##arg)
  11. #define EMAS_ERR(fmt, arg...) ShowLog(EMASS_LOG_ERROR, "[E][T:%lx] %s(%d) "fmt, pthread_self(), __FILE__, __LINE__, ##arg)
復(fù)制代碼

作者: evaspring    時(shí)間: 2016-04-18 10:58
不是說宏里面的變量不能被展開么?
作者: xhx321    時(shí)間: 2016-04-18 12:19
多謝回復(fù)。
我之前的描述可能把你搞暈了。所以重新更新了一下問題。 謝謝!
回復(fù) 10# yulihua49


   
作者: yulihua49    時(shí)間: 2016-04-18 12:47
本帖最后由 yulihua49 于 2016-04-18 13:23 編輯
xhx321 發(fā)表于 2016-04-15 12:21
貌似原來的描述把問題寫的很亂, 也沒表述清楚需求及重點(diǎn)。在這里重新寫一下:
需要實(shí)現(xiàn)一個(gè)宏定義:O_P ...

你這個(gè)方法是錯(cuò)誤的,無法實(shí)現(xiàn)。
你還是看看我給你的例子,可以實(shí)現(xiàn)你的要求。函數(shù)名和文件名的用法一樣,改成
__FUNCTION__
就可以了。tlog.c:

  1. #include <strproc.h>
  2. #include <log.h>

  3. int main(int argc,char *argv[])
  4. {
  5.         if(argc>1) envcfg(argv[1]);
  6.         EMAS_DEBUG("myname is %s",argv[0]);
  7.         EMAS_ERR("PID is %d",getpid());
  8.         return 0;
  9. }
復(fù)制代碼
結(jié)果:

  1. 5  04/18 20:45'53 [D][T:7f7758e5d740] tlog.c(7) myname is ./tlog
  2. 1  04/18 20:45'53 [E][T:7f7758e5d740] tlog.c(8) PID is 26996
復(fù)制代碼
系統(tǒng)時(shí)間設(shè)置的不對,這別管了,改成函數(shù)名也很簡單。

是不是你要的結(jié)果?

給你改個(gè)帶函數(shù)名的:
結(jié)果:

  1. 5  04/18 20:53'53 [D][T:7f0e8c42c740] tlog.c(7) main: myname is ./tlog
  2. 1  04/18 20:53'53 [E][T:7f0e8c42c740] tlog.c(8) main: PID is 29250
復(fù)制代碼
log.h:


  1. #define EMAS_DEBUG(fmt, arg...) ShowLog(EMASS_LOG_DEBUG, "[D][T:%lx] %s(%d) %s: "fmt, pthread_self(), __FILE__, __LINE__, __FUNCTION__, ##arg)
  2. #define EMAS_VERBOSE(fmt, arg...) ShowLog(EMASS_LOG_VERBOSE, "[V][T:%lx] %s(%d) %s: "fmt, pthread_self(), __FILE__, __LINE__, __FUNCTION__, ##arg)
  3. #define EMAS_INFO(fmt, arg...) ShowLog(EMASS_LOG_INFO, "[I][T:%lx] %s(%d) %s: "fmt, pthread_self(), __FILE__, __LINE__, __FUNCTION__, ##arg)
  4. #define EMAS_WARN(fmt, arg...) ShowLog(EMASS_LOG_WARN, "[W][T:%lx] %s(%d) %s: "fmt, pthread_self(), __FILE__, __LINE__, __FUNCTION__, ##arg)
  5. #define EMAS_ERR(fmt, arg...) ShowLog(EMASS_LOG_ERROR, "[E][T:%lx] %s(%d) %s: "fmt, pthread_self(), __FILE__, __LINE__, __FUNCTION__, ##arg)
復(fù)制代碼

作者: lwhjava    時(shí)間: 2016-04-19 22:13
回復(fù) 13# yulihua49


    這個(gè)宏定義很不錯(cuò)
作者: yulihua49    時(shí)間: 2016-04-20 12:50
lwhjava 發(fā)表于 2016-04-19 22:13
回復(fù) 13# yulihua49

我們采取一個(gè)日志函數(shù)+多個(gè)級別宏,而不采取多個(gè)函數(shù)的方式。
單個(gè)的函數(shù)還可以可變級別,就是級別可以是變量,有利于動態(tài)設(shè)置級別。
作者: cokeboL    時(shí)間: 2016-04-20 14:03
回復(fù) 15# yulihua49


    我是有Info Warn Error等幾種函數(shù),然后統(tǒng)一配置tag作為不同模塊的標(biāo)示,調(diào)試時(shí)候Info Warn Error里面看有沒有配置相應(yīng)的tag,配置了就輸出,沒配置的不輸出,當(dāng)然還分日志記錄方式比如控制臺或者文件

    加個(gè)tag之后想只調(diào)試某些模塊可以很方便屏蔽其他模塊的輸出,看日志舒服些。不過像數(shù)據(jù)分析那樣對日志做過濾也方便
作者: yulihua49    時(shí)間: 2016-04-21 11:47
本帖最后由 yulihua49 于 2016-04-21 11:59 編輯
cokeboL 發(fā)表于 2016-04-20 14:03
回復(fù) 15# yulihua49

我這個(gè)日志系統(tǒng)是可以加TAG的:
結(jié)果:

  1. 5 ./tlog:2930:  04/21 19:18'43 [D][T:7ff4fd92e740] tlog.c(9) main: myname is ./tlog
  2. 1 ./tlog:2930:  04/21 19:18'43 [E][T:7ff4fd92e740] tlog.c(10) main: PID is 2930
復(fù)制代碼
程序:

  1. #include <strproc.h>
  2. #include <log.h>
  3. static char tag[100];
  4. int main(int argc,char *argv[])
  5. {
  6.         if(argc>1) envcfg(argv[1]);
  7.         sprintf(tag,"%s:%d: ",argv[0],getpid());
  8.         Showid=tag;
  9.         EMAS_DEBUG("myname is %s",argv[0]);
  10.         EMAS_ERR("PID is %d",getpid());
  11.         return 0;
  12. }
復(fù)制代碼
還可以按線程分別TAG。

配置了TAG就用,不配置就沒有TAG。
日志還是有的,顯示級別和TAG兩回事。

配置成3級,5級的就自動沒有了:

  1. 5 ./tlog:2930:  04/21 19:18'43 [D][T:7ff4fd92e740] tlog.c(9) main: myname is ./tlog
  2. 1 ./tlog:2930:  04/21 19:18'43 [E][T:7ff4fd92e740] tlog.c(10) main: PID is 2930
  3. 1 ./tlog:3474:  04/21 19:26'21 [E][T:7f0a1c8a7740] tlog.c(10) main: PID is 3474
復(fù)制代碼
前兩行是5級的,后一行是3級的。
配置內(nèi)容:

  1. LOGFILE=./LOG
  2. LOGLEVEL=3
復(fù)制代碼

作者: cokeboL    時(shí)間: 2016-04-21 17:58
回復(fù) 17# yulihua49


    對對對,這樣好用我的也是
作者: MMMIX    時(shí)間: 2016-04-22 22:25
cokeboL 發(fā)表于 2016-04-15 16:17
碼農(nóng)最大的悲哀是該產(chǎn)品導(dǎo)向的場景,非要語言語法導(dǎo)向,費(fèi)力不討好,除了看上去語法牛逼不容易看懂,然并卵。


你這就快走到另外一個(gè)極端了:技術(shù)無用論。
作者: cokeboL    時(shí)間: 2016-04-23 11:19
回復(fù) 19# MMMIX


不是的,我只是不糾結(jié)于語法,并不是反對鉆研技術(shù)。

因?yàn)橐娺^太多糾結(jié)于語法的cpper了,有哥們面試遇到語法黨面試官,專問各種語言特性,然后壓價(jià),
不排除有項(xiàng)目就是需要這些,或者就是需要這種語法精通的人,但是絕大多數(shù),都是不需要如此的搬磚
職位罷了。cpp的鄙視java的,java的鄙視c#的,而同是c++的又要通過語法、標(biāo)準(zhǔn)來形成鄙視鏈,對
技術(shù)的鉆研是非常非常棒的事情,但現(xiàn)實(shí)中的情況是很大一部分人會因?yàn)樽约簩φZ言投入了太多精力而
過度迷戀語言本身,從而導(dǎo)致了鄙視鏈之類的事情,這樣的態(tài)度對待編程語言我覺得對做事沒有好處。。
作者: cokeboL    時(shí)間: 2016-04-23 11:23
回復(fù) 19# MMMIX


還有一些現(xiàn)象就是,3年5年c++,難精通,難積累到足夠的內(nèi)力或者習(xí)得框架、架構(gòu)能力,同樣努力
的情況下,java或者其他語言,可能已經(jīng)達(dá)到架構(gòu)師的水平,雖然內(nèi)力甚至cpper高些,但落實(shí)到做產(chǎn)
品的能力上卻不如java或其他語言的

所以我不是說技術(shù)無用,技術(shù)選型,可供選擇的方案太多,技術(shù)路線也是,沒有必要拘泥于單一語言




歡迎光臨 Chinaunix (http://www.72891.cn/) Powered by Discuz! X3.2