Add support for const parameters in fakes (C only)
diff --git a/fakegen.rb b/fakegen.rb
index 4a04bc9..339742c 100644
--- a/fakegen.rb
+++ b/fakegen.rb
@@ -77,7 +77,7 @@
 def define_save_arg_helper
   putd ""
   putd "#define SAVE_ARG(FUNCNAME, n) \\"
-  putd "    FUNCNAME##_fake.arg##n##_val = arg##n"
+  putd "    memcpy((void*)&FUNCNAME##_fake.arg##n##_val, (void*)&arg##n, sizeof(arg##n));"
 end
 
 def define_room_for_more_history
@@ -89,7 +89,7 @@
 def define_save_arg_history_helper
   putd ""
   putd "#define SAVE_ARG_HISTORY(FUNCNAME, ARGN) \\"
-  putd "    FUNCNAME##_fake.arg##ARGN##_history[FUNCNAME##_fake.call_count] = arg##ARGN"
+  putd "    memcpy((void*)&FUNCNAME##_fake.arg##ARGN##_history[FUNCNAME##_fake.call_count], (void*)&arg##ARGN, sizeof(arg##ARGN));"
 end
 
 def define_history_dropped_helper
diff --git a/fff.h b/fff.h
index e62e403..a116073 100644
--- a/fff.h
+++ b/fff.h
@@ -29,13 +29,13 @@
     unsigned int arg_histories_dropped; \
 
 #define SAVE_ARG(FUNCNAME, n) \
-    FUNCNAME##_fake.arg##n##_val = arg##n
+    memcpy((void*)&FUNCNAME##_fake.arg##n##_val, (void*)&arg##n, sizeof(arg##n));
 
 #define ROOM_FOR_MORE_HISTORY(FUNCNAME) \
   FUNCNAME##_fake.call_count < FFF_ARG_HISTORY_LEN
 
 #define SAVE_ARG_HISTORY(FUNCNAME, ARGN) \
-    FUNCNAME##_fake.arg##ARGN##_history[FUNCNAME##_fake.call_count] = arg##ARGN
+    memcpy((void*)&FUNCNAME##_fake.arg##ARGN##_history[FUNCNAME##_fake.call_count], (void*)&arg##ARGN, sizeof(arg##ARGN));
 
 #define HISTORY_DROPPED(FUNCNAME) \
     FUNCNAME##_fake.arg_histories_dropped++
diff --git a/test/fff_test_cpp.cpp b/test/fff_test_cpp.cpp
index 9599e31..77103e9 100644
--- a/test/fff_test_cpp.cpp
+++ b/test/fff_test_cpp.cpp
@@ -20,7 +20,6 @@
 FAKE_VOID_FUNC(voidfunc1, int);
 FAKE_VOID_FUNC(voidfunc2, char, char);
 FAKE_VALUE_FUNC(long, longfunc0);
-FAKE_VALUE_FUNC(int, strlcpy3, char* const, const char* const, const size_t);
 
 class FFFTestSuite: public testing::Test
 {
@@ -30,7 +29,6 @@
         RESET_FAKE(voidfunc1);
         RESET_FAKE(voidfunc2);
         RESET_FAKE(longfunc0);
-        RESET_FAKE(strlcpy3);
         FFF_RESET_HISTORY();
     }
 };
diff --git a/test/global_fakes.c b/test/global_fakes.c
index 008aa10..eb0d59c 100644
--- a/test/global_fakes.c
+++ b/test/global_fakes.c
@@ -6,4 +6,6 @@
 DEFINE_FAKE_VALUE_FUNC0(long, longfunc0);
 DEFINE_FAKE_VALUE_FUNC0(enum MYBOOL, enumfunc0);
 DEFINE_FAKE_VALUE_FUNC0(struct MyStruct, structfunc0);
-DECLARE_FAKE_VALUE_FUNC3(int, strlcpy3, char* const, const char* const, const size_t);
+#ifndef __cplusplus
+DEFINE_FAKE_VALUE_FUNC3(int, strlcpy3, char* const, const char* const, const size_t);
+#endif /* __cplusplus */
diff --git a/test/global_fakes.h b/test/global_fakes.h
index 3bb6d20..37b933e 100644
--- a/test/global_fakes.h
+++ b/test/global_fakes.h
@@ -3,6 +3,7 @@
 #define GLOBAL_FAKES_H_
 
 #include "../fff.h"
+#include "string.h"
 
 
 ////  Imaginary production code header file ///
@@ -24,6 +25,8 @@
 DECLARE_FAKE_VALUE_FUNC0(long, longfunc0);
 DECLARE_FAKE_VALUE_FUNC0(enum MYBOOL, enumfunc0);
 DECLARE_FAKE_VALUE_FUNC0(struct MyStruct, structfunc0);
+#ifndef __cplusplus
 DECLARE_FAKE_VALUE_FUNC3(int, strlcpy3, char* const, const char* const, const size_t);
+#endif /* __cplusplus */
 
 #endif /* GLOBAL_FAKES_H_ */
diff --git a/test/test_cases.include b/test/test_cases.include
index 9689731..52ae902 100644
--- a/test/test_cases.include
+++ b/test/test_cases.include
@@ -63,11 +63,13 @@
     ASSERT_EQ(voidfunc2_fake.arg1_val, 0);
 }
 
+#ifndef __cplusplus
 TEST_F(FFFTestSuite, when_fake_func_called_then_const_arguments_captured)
 {
     char dst[80];
     strlcpy3(dst, __FUNCTION__, sizeof(__FUNCTION__));
 }
+#endif /* __cplusplus */
 
 // Argument history
 TEST_F(FFFTestSuite, when_fake_func_created_default_history_is_fifty_calls)