スポンサーリンク

C言語で可変引数を扱う場合は、stdargのva_argなどを利用します。
マクロ(define)でも可変引数を扱いたいことがあります。

マクロで可変引数を扱う場合は、__VA_ARGS__を利用します。

#define foo(...) bar(__VA_ARGS__)


デバッグで関数名と行数を出したいときがあります。
場合によっては、ファイル名とライン行とかもやります。
そんなときは、このようなマクロを書くと便利です。
関数名:ライン行 デバッグメッセージ

#define dprintf(s,...) printf("%s:%d: " s, __func__, __LINE__,__VA_ARGS__)


ファイル名:ライン行 デバッグメッセージ

#define dprintf(s,...) printf("%s:%d: " s, __FILE__, __LINE__,__VA_ARGS__)


ファイル名:ライン行:関数名 デバッグメッセージ

#define dprintf(s,...) printf("%s:%d:%s " s, __FILE__, __LINE__,__func__,__VA_ARGS__)


arg.c

     1	#include <stdio.h>
     2	#include <stdlib.h>
     3	#include <stdarg.h>
     4	
     5	#define dprintf(s,...)		printf("%s:%d: " s, __func__, __LINE__,__VA_ARGS__)
     6	
     7	int
     8	main (int argc, char *argv[])
     9	{
    10		int	i = 300;
    11		char	*p = "hoge";
    12		dprintf ("%s %d\n", p, i);
    13		++i;
    14		++p;
    15		dprintf ("%s %d\n", p, i);
    16	
    17		exit (EXIT_SUCCESS);
    18	}

コンパイル

cc arg.c


実行結果

main:13: hoge 300
main:16: oge 301

__VA_ARGS__とprintfを利用して簡単にデバッグ用のprintfを作成することができます。
デバッグが終わったら、dprintfをなしにしてしまえばOKです。

#define dprintf(...) ((void)0)


関連
[2008-06-23-1] C言語プログラミング マクロで可変引数を扱う方法とデバッグprintf
[2008-06-23-2] C言語プログラミング ifdefでデバッグする方法
[2008-06-17-1] C言語 可変引数 va_arg

参照しているページ (サイト内): [2008-06-23-2] [2008-06-23-1] [2008-06-17-1]

スポンサーリンク
スポンサーリンク
 
いつもシェア、ありがとうございます!


もっと情報を探しませんか?

関連記事

最近の記事

人気のページ

スポンサーリンク
 

過去ログ

2020 : 01 02 03 04 05 06 07 08 09 10 11 12
2019 : 01 02 03 04 05 06 07 08 09 10 11 12
2018 : 01 02 03 04 05 06 07 08 09 10 11 12
2017 : 01 02 03 04 05 06 07 08 09 10 11 12
2016 : 01 02 03 04 05 06 07 08 09 10 11 12
2015 : 01 02 03 04 05 06 07 08 09 10 11 12
2014 : 01 02 03 04 05 06 07 08 09 10 11 12
2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12
2003 : 01 02 03 04 05 06 07 08 09 10 11 12

サイト

Vim入門

C言語入門

C++入門

JavaScript/Node.js入門

Python入門

FreeBSD入門

Ubuntu入門

セキュリティ入門

パソコン自作入門

ブログ

トップ


プライバシーポリシー