Menu > C > C Scrap Note

目次


一風変わったログの出し方

とある事情でまったくログを書けない環境で仕事をすることがあった。
あまりにも面倒になったので、下のようなことを考えてみた。

サンプルプログラム

  1. #include <stdio.h>
  2.  
  3. int main ( int argv, const char** args )
  4. {
  5. int i;
  6. printf ("argv == %d\n", argv);
  7. if (argv < 0)
  8. {
  9. printf ("root A\n", argv);
  10. i = -1;
  11. }
  12. else
  13. {
  14. printf ("root B\n", argv);
  15.  
  16. for (i = 0; i < argv; i++ )
  17. {
  18. printf ("args[%d] : [%s]\n", i, args[i]);
  19. }
  20. }
  21.  
  22. return 0;
  23. }
  24.  

if文のログを出す。

こんな些細なログすら書けないの(T_T)
仕方ないのでマクロを使ってやってみた。
  1. extern long logCondition(char* file, int line, const char* func, char* target, long result, char* condition)
  2. {
  3. printf ("%s:%d: %s() : %d <= %s(%s)\n", file, line, func, result, target, condition);
  4. return result;
  5. }
  6.  
  7. #define if(a) if(logCondition(__FILE__,__LINE__,__func__,"if",(long)a,#a))
  8.  
これですべてのif文の条件式にログが埋め込まれる。
同じやり方で switch文 や while文も書ける。

else文のログを出す。

非常に難易度が高い気がしている。
  1. // これはエラーになるし、
  2. #define else printf("root else\n");else
  3.  
  4. // これでは条件が変わってしまう。
  5. #define else else printf("root else\n");
  6.  
  7. // こいつはif文のマクロと被って何がなにやら。。。
  8. #define else else if(logCondition(__FILE__,__LINE__,__func__,"else",1,""))
  9.  
else文って難しい。

for文のログを出す。

for文は中に条件を入れない書き方なので、別途作ってみた。
  1. extern void logLoop(char* file, int line, const char* func, char* target, char* condition)
  2. {
  3. printf ("%s:%d: %s() : %s(%s)\n", file, line, func, target, condition);
  4. }
  5.  
  6. #define for(arg...) logLoop(__FILE__,__LINE__,__func__,"for",#arg);for(arg)
  7.  

色々並べてみた

  1. /* **************************************************************** */
  2. extern long logCondition(char* file, int line, const char* func, char* target, long result, char* condition)
  3. {
  4. printf ("%s:%d: %s() : %d <= %s(%s)\n", file, line, func, result, target, condition);
  5. return result;
  6. }
  7.  
  8. #define if(a) if(logCondition(__FILE__,__LINE__,__func__,"if",(long)a,#a))
  9. #define switch(a) switch(logCondition(__FILE__,__LINE__,__func__,"switch",(long)a,#a))
  10. #define while(a) while(logCondition(__FILE__,__LINE__,__func__,"while",(long)a,#a))
  11.  
  12. /* **************************************************************** */
  13. extern void logLoop(char* file, int line, const char* func, char* target, char* condition)
  14. {
  15. printf ("%s:%d: %s() : %s(%s)\n", file, line, func, target, condition);
  16. }
  17.  
  18. #define for(arg...) logLoop(__FILE__,__LINE__,__func__,"for",#arg);for(arg)
  19.  
  20. /* **************************************************************** */
  21. extern void logLable(char* file, int line, const char* func, char* target)
  22. {
  23. printf ("%s:%d: %s() : %s\n", file, line, func, target);
  24. }
  25.  
  26. #define do logLable(__FILE__,__LINE__,__func__,"do");do
  27.  
  28. /* **************************************************************** */
  29. #define debug(fmt, arg...) printf("%s:%d: %s() : ",__FILE__,__LINE__,__func__); printf(fmt, ##arg); printf("\n");
  30.  

まとめ

それにしても、なんでこんなことせにゃならんのだ。。。
else文 と case文 の出力方法について思いついた方は、是非教えてください。

関連リンク

&trackback()
タグ一覧:C C Scrap Note



タグ:

C C Scrap Note
最終更新:2012年07月05日 01:32