1. ホーム

関数 'asprintf' の暗黙の宣言による警告の解消

2022-02-22 09:39:48

asprintfは非常に使いやすいのですが、CライブラリのGNU拡張であるため、以下のような警告が出て使用されることが多いようです。

警告:関数 'asprintf' の暗黙の宣言 [-Wimplicit-function-declaration]


調査の結果、asprintfのヘッダーファイルは stdio.h で、そのヘッダーファイルの中に

#ifdef __USE_GNU
/* Write formatted output to a string dynamically allocated with `malloc'.
   Store the address of the string in *PTR. */
extern int vasprintf (char **__restrict __ptr, __const char *__restrict __f,
		      _G_va_list __arg)
     __THROW __attribute__ ((__format__ (__printf__, 2, 0))) __wur;
extern int __asprintf (char **__restrict __ptr,
		       __const char *__restrict __fmt, ...)
     __THROW __attribute__ ((__format__ (__printf__, 2, 3))) __wur;
extern int asprintf (char **__restrict __ptr,
		     __const char *__restrict __fmt, ...)
     __THROW __attribute__ ((__format__ (__printf__, 2, 3))) __wur;
#endif

しかし __USE_GNU はglibcの内容をマクロで定義したもので、自分たちのコードでは定義できないので、どう修正すればいいのか?


<スパン 解決策

makefile にコンパイルオプション -D_GNU_SOURCE を追加します。

CMakeを使用している場合、add_definitions (-D_GNU_SOURCE)を追加する必要があります。


もし、#ifdef __USE_GNU のような問題が発生した場合は、上記のように設定することで解決を試みることができます。