diff --git a/CMakeLists.txt b/CMakeLists.txt
index 22f24e094bcc2086f4ca929116949e3d2c1d74b2..1bcbdcb0c647128c7d338cdaef03e163fe2dae96 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -3,6 +3,7 @@ set(CMAKE_C_STANDARD 99)
 include(CheckIncludeFiles)
 include(TestBigEndian)
 include(CheckCSourceCompiles)
+include(CheckSymbolExists)
 include(cmake/macros.cmake)
 project(libaec)
 set(libaec_VERSION_MAJOR 1)
@@ -21,6 +22,12 @@ endif(NOT HAVE_DECL___BUILTIN_CLZLL)
 find_inline_keyword()
 find_restrict_keyword()
 
+check_symbol_exists(snprintf "stdio.h" HAVE_SNPRINTF)
+if(NOT HAVE_SNPRINTF)
+  check_symbol_exists(_snprintf "stdio.h" HAVE__SNPRINTF)
+  check_symbol_exists(_snprintf_s "stdio.h" HAVE__SNPRINTF_S)
+endif(NOT HAVE_SNPRINTF)
+
 configure_file(
   ${CMAKE_CURRENT_SOURCE_DIR}/cmake/config.h.in
   ${CMAKE_CURRENT_BINARY_DIR}/config.h)
diff --git a/cmake/config.h.in b/cmake/config.h.in
index 9f5fffb04602211e2f26f647da1db80583c29e55..d5783e081b2639762aae53ae12828e94abd1cc24 100644
--- a/cmake/config.h.in
+++ b/cmake/config.h.in
@@ -3,3 +3,6 @@
 #cmakedefine WORDS_BIGENDIAN 1
 #cmakedefine HAVE_DECL___BUILTIN_CLZLL 1
 #cmakedefine HAVE_BSR64 1
+#cmakedefine HAVE_SNPRINTF 1
+#cmakedefine HAVE__SNPRINTF 1
+#cmakedefine HAVE__SNPRINTF_S 1
diff --git a/configure.ac b/configure.ac
index 0226e03923d762dbb74ff4767e8fc0c89aa5d6dd..d4789b9b9cbbb3b59ec25b8ce6ce6bb28860dbd3 100644
--- a/configure.ac
+++ b/configure.ac
@@ -25,7 +25,7 @@ AC_TYPE_UINT8_T
 AC_C_INLINE
 AC_C_RESTRICT
 
-AC_CHECK_FUNCS([memset strstr])
+AC_CHECK_FUNCS([memset strstr snprintf])
 AC_CHECK_DECLS(__builtin_clzll)
 
 AM_EXTRA_RECURSIVE_TARGETS([bench benc bdec])
diff --git a/tests/check_aec.h b/tests/check_aec.h
index 02c3e772929878baac52df3012ebea5b7920bc94..2f6abd31ca52ded68cfc944c344f8da76b06c867 100644
--- a/tests/check_aec.h
+++ b/tests/check_aec.h
@@ -1,5 +1,7 @@
 #ifndef CHECK_AEC_H
 #define CHECK_AEC_H 1
+
+#include <config.h>
 #include "libaec.h"
 
 struct test_state {
@@ -24,6 +26,18 @@ int update_state(struct test_state *state);
 int encode_decode_small(struct test_state *state);
 int encode_decode_large(struct test_state *state);
 
+#ifndef HAVE_SNPRINTF
+#ifdef HAVE__SNPRINTF_S
+#define snprintf(d, n, ...) _snprintf_s((d), (n), _TRUNCATE, __VA_ARGS__)
+#else
+#ifdef HAVE__SNPRINTF
+#define snprintf _snprintf
+#else
+#error "no snprintf compatible function found"
+#endif /* HAVE__SNPRINTF */
+#endif /* HAVE__SNPRINTF_S */
+#endif /* HAVE_SNPRINTF */
+
 #ifdef _WIN32
 #define CHECK_PASS "PASS"
 #define CHECK_FAIL "FAIL"