この問題を解決するのを手伝ってください。これは、Cで行番号、ファイル名、var argsを取得するためのサンプルコードです。これを実行しようとすると、いくつかのエラーが発生しました。私はこれを行う多くの方法があると確信しています。しかし、私はいくつかの機能を達成するために既存のコードを使用しなければなりません。どんな助けや提案も大歓迎です。マクロ内のマクロC
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#define MY_MACRO1(fmt, args...) \
{ \
char buf_d[1024]; \
MY_MACRO2(__FILE__, __LINE__,call_func(buf_d,sizeof(buf_d),fmt,##args)); \
}
#define MY_MACRO2(__FILE__, __LINE__,fmt, ...) printf("%s : %d -> %s : \n",__FILE__, __LINE__, __VA_ARGS__);
char * call_func(char *buf_t, size_t size, const char *fmt, ...)
{
va_list ap;
va_start(ap,fmt);
vsnprintf(buf_t, size, fmt, ap);
va_end(ap);
return buf_t;
}
int main()
{
printf("\n Now I am printintg macro....\n");
MY_MACRO1("Macro is working fine..\n");
return 0;
}
出力:
マクロ展開を見つけてください。マクロの最後の引数(funcの戻り値)がありません。
char buf_d[1024];
printf("%s : %d -> %s : \n","file.c",35,);;
エラー:
file.c:35:83: error: expected expression
{ char buf_d[1024]; printf("%s : %d -> %s : \n","file.c", 35,);; };
^
1エラーが発生しました。
象:なぜマクロを使用しますか? – user4581301
デュアルタグの理由はなぜですか?あなたは、質問で指定していないコンパイラの非標準コンパイラ拡張を使用しています。それは有効なCになる必要がありますか?それは有効なC + +になる必要がありますか?それはあなたの特定のコンパイラに受け入れられる必要がありますか? 3つすべてがあなたに異なる答えを与えるでしょう。そしてなぜ地球上で '__FILE__'と' __LINE__'をマクロパラメータとして再定義するのを選ぶのですか? – hvd
IIRC 'fmt、args ...'後に '、## args'が続くのは移植不可能な拡張です。 'fmt、args ...'と '__VA_ARGS__'の代わりに' fmt、## args'の代わりに '...'を使うことができます。 – technosaurus