[FFmpeg-devel] [PATCH 07/17] Make LOCAL_ALIGNED macro fully C99 compatible

Mans Rullgard mans
Tue Jan 18 20:32:11 CET 2011


C99 variadic macros require more arguments than there are named
parameters in the definition.  This means we must perform this
little dance to avoid having two different macros.
---
 libavcodec/dsputil.h |   20 +++++++++++++-------
 1 files changed, 13 insertions(+), 7 deletions(-)

diff --git a/libavcodec/dsputil.h b/libavcodec/dsputil.h
index 1571491..261bc14 100644
--- a/libavcodec/dsputil.h
+++ b/libavcodec/dsputil.h
@@ -664,20 +664,26 @@ static inline void emms(void)
 #   define STRIDE_ALIGN 8
 #endif
 
-#define LOCAL_ALIGNED(a, t, v, s, ...)                          \
-    uint8_t la_##v[sizeof(t s __VA_ARGS__) + (a)];              \
-    t (*v) __VA_ARGS__ = (void *)FFALIGN((uintptr_t)la_##v, a)
+#define CAR(...) XCAR(__VA_ARGS__, x)
+#define XCAR(x, ...) x
+
+#define CDR(...) XCDR(__VA_ARGS__,,)
+#define XCDR(a, b, ...) b
+
+#define LOCAL_ALIGNED(a, t, v, ...)                                     \
+    uint8_t la_##v[sizeof(t CAR(__VA_ARGS__) CDR(__VA_ARGS__)) + (a)];  \
+    t (*v) CDR(__VA_ARGS__) = (void *)FFALIGN((uintptr_t)la_##v, a)
 
 #if HAVE_LOCAL_ALIGNED_8
-#   define LOCAL_ALIGNED_8(t, v, s, ...) DECLARE_ALIGNED(8, t, v) s __VA_ARGS__
+#   define LOCAL_ALIGNED_8(t, v, ...) DECLARE_ALIGNED(8, t, v) CAR(__VA_ARGS__) CDR(__VA_ARGS__)
 #else
-#   define LOCAL_ALIGNED_8(t, v, s, ...) LOCAL_ALIGNED(8, t, v, s, __VA_ARGS__)
+#   define LOCAL_ALIGNED_8(t, v, ...) LOCAL_ALIGNED(8, t, v, __VA_ARGS__)
 #endif
 
 #if HAVE_LOCAL_ALIGNED_16
-#   define LOCAL_ALIGNED_16(t, v, s, ...) DECLARE_ALIGNED(16, t, v) s __VA_ARGS__
+#   define LOCAL_ALIGNED_16(t, v, ...) DECLARE_ALIGNED(16, t, v) CAR(__VA_ARGS__) CDR(__VA_ARGS__)
 #else
-#   define LOCAL_ALIGNED_16(t, v, s, ...) LOCAL_ALIGNED(16, t, v, s, __VA_ARGS__)
+#   define LOCAL_ALIGNED_16(t, v, ...) LOCAL_ALIGNED(16, t, v, __VA_ARGS__)
 #endif
 
 /* PSNR */
-- 
1.7.3.5




More information about the ffmpeg-devel mailing list