diff --git a/native/src/correction.cpp b/native/src/correction.cpp
index 2fc0569fa7be60b1e6b991bc5f9bcd888c597a5b..4df1c4efbd2738a5e0f4078e13623b65b60e8d8d 100644
--- a/native/src/correction.cpp
+++ b/native/src/correction.cpp
@@ -24,6 +24,7 @@
 
 #include "char_utils.h"
 #include "correction.h"
+#include "defines.h"
 #include "dictionary.h"
 #include "proximity_info.h"
 
diff --git a/native/src/defines.h b/native/src/defines.h
index 1e108cb17f52c53afab3749bf71a8369e427b586..5b5c548509233816cda21ad2cf86627eb25a1d06 100644
--- a/native/src/defines.h
+++ b/native/src/defines.h
@@ -241,8 +241,8 @@ static void prof_out(void) {
 #define MIN_USER_TYPED_LENGTH_FOR_MULTIPLE_WORD_SUGGESTION 3
 #define MIN_USER_TYPED_LENGTH_FOR_EXCESSIVE_CHARACTER_SUGGESTION 3
 
-#define min(a,b) ((a)<(b)?(a):(b))
-#define max(a,b) ((a)>(b)?(a):(b))
+template<typename T> inline T min(T a, T b) { return a < b ? a : b; }
+template<typename T> inline T max(T a, T b) { return a > b ? a : b; }
 
 // The ratio of neutral area radius to sweet spot radius.
 #define NEUTRAL_AREA_RADIUS_RATIO 1.3f
diff --git a/native/src/words_priority_queue.h b/native/src/words_priority_queue.h
index e8cd983b1c23580a83e1bbb450d34beb47f72f4c..249962eec0592132c322a69ec0022f6ea8589dc0 100644
--- a/native/src/words_priority_queue.h
+++ b/native/src/words_priority_queue.h
@@ -17,6 +17,7 @@
 #ifndef LATINIME_WORDS_PRIORITY_QUEUE_H
 #define LATINIME_WORDS_PRIORITY_QUEUE_H
 
+#include <cstring> // for memcpy()
 #include <iostream>
 #include <queue>
 #include "defines.h"
@@ -93,7 +94,8 @@ class WordsPriorityQueue {
 
     int outputSuggestions(int *frequencies, unsigned short *outputChars) {
         mHighestSuggestedWord = 0;
-        const unsigned int size = min(MAX_WORDS, mSuggestions.size());
+        const unsigned int size = min(
+              MAX_WORDS, static_cast<unsigned int>(mSuggestions.size()));
         int index = size - 1;
         while (!mSuggestions.empty() && index >= 0) {
             SuggestedWord* sw = mSuggestions.top();