bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

snprintf functions errors on MSVC


From: Bruno Haible
Subject: snprintf functions errors on MSVC
Date: Sat, 17 Dec 2016 23:11:06 +0100
User-agent: KMail/4.8.5 (Linux/3.8.0-44-generic; KDE/4.8.5; x86_64; ; )

Compiling a gnulib testdir with MSVC 14, I get these errors:

C:\cygwin64\home\bruno\testdir-posix\gllib\snprintf.c(38): error C2084: 
function 'int snprintf(char *const ,const std::size_t,const char *const ,...)' 
already has a body
C:\cygwin64\home\bruno\testdir-posix\gllib\vsnprintf.c(40): error C2084: 
function 'int vsnprintf(char *const ,const std::size_t,const char *const 
,va_list)' already has a body

The reason is that these functions are defined as inline functions in <stdio.h>
(unless _NO_CRT_STDIO_INLINE is defined):
  vfprintf vprintf fprintf printf vsnprintf sprintf snprintf
  vfscanf vscanf fscanf vsscanf

configure finds:
  checking whether vsnprintf is declared... yes
  checking whether vsnprintf is declared without a macro... yes
  checking for vsnprintf... no
and as a result, sets REPLACE_VSNPRINTF=0. This fixes it:

  
2016-12-17  Bruno Haible  <address@hidden>

        Avoid redefinition errors on MSVC.
        * m4/snprintf.m4 (gl_REPLACE_SNPRINTF): Set REPLACE_SNPRINTF to 1 if
        the function may be defined as an inline function.
        * m4/vsnprintf.m4 (gl_REPLACE_VSNPRINTF): Set REPLACE_VSNPRINTF to 1 if
        the function may be defined as an inline function.

diff --git a/m4/snprintf.m4 b/m4/snprintf.m4
index f876b55..30aa25c 100644
--- a/m4/snprintf.m4
+++ b/m4/snprintf.m4
@@ -1,4 +1,4 @@
-# snprintf.m4 serial 6
+# snprintf.m4 serial 7
 dnl Copyright (C) 2002-2004, 2007-2016 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -46,6 +46,14 @@ AC_DEFUN([gl_REPLACE_SNPRINTF],
   AC_LIBOBJ([snprintf])
   if test $ac_cv_func_snprintf = yes; then
     REPLACE_SNPRINTF=1
+  else
+    AC_CHECK_DECLS_ONCE([snprintf])
+    if test $ac_cv_have_decl_snprintf = yes; then
+      dnl If the function is declared but does not appear to exist, it may be
+      dnl defined as an inline function. In order to avoid a conflict, we have
+      dnl to define rpl_snprintf, not snprintf.
+      REPLACE_SNPRINTF=1
+    fi
   fi
   gl_PREREQ_SNPRINTF
 ])
diff --git a/m4/vsnprintf.m4 b/m4/vsnprintf.m4
index e056f05..02da308 100644
--- a/m4/vsnprintf.m4
+++ b/m4/vsnprintf.m4
@@ -1,4 +1,4 @@
-# vsnprintf.m4 serial 6
+# vsnprintf.m4 serial 7
 dnl Copyright (C) 2002-2004, 2007-2016 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -46,6 +46,14 @@ AC_DEFUN([gl_REPLACE_VSNPRINTF],
   AC_LIBOBJ([vsnprintf])
   if test $ac_cv_func_vsnprintf = yes; then
     REPLACE_VSNPRINTF=1
+  else
+    AC_CHECK_DECLS_ONCE([vsnprintf])
+    if test $ac_cv_have_decl_vsnprintf = yes; then
+      dnl If the function is declared but does not appear to exist, it may be
+      dnl defined as an inline function. In order to avoid a conflict, we have
+      dnl to define rpl_vsnprintf, not vsnprintf.
+      REPLACE_VSNPRINTF=1
+    fi
   fi
   gl_PREREQ_VSNPRINTF
 ])




reply via email to

[Prev in Thread] Current Thread [Next in Thread]