-#define THROW0(c,v,m) _THROW(c,v,(m?bprintf(m):NULL))
-#define THROW1(c,v,m,a1) _THROW(c,v,bprintf(m,a1))
-#define THROW2(c,v,m,a1,a2) _THROW(c,v,bprintf(m,a1,a2))
-#define THROW3(c,v,m,a1,a2,a3) _THROW(c,v,bprintf(m,a1,a2,a3))
-#define THROW4(c,v,m,a1,a2,a3,a4) _THROW(c,v,bprintf(m,a1,a2,a3,a4))
-#define THROW5(c,v,m,a1,a2,a3,a4,a5) _THROW(c,v,bprintf(m,a1,a2,a3,a4,a5))
-#define THROW6(c,v,m,a1,a2,a3,a4,a5,a6) _THROW(c,v,bprintf(m,a1,a2,a3,a4,a5,a6))
+/** @brief Builds and throws an exception
+ @hideinitializer */
+#define THROW(c, v) _XBT_THROW(c, v, NULL)
+
+/** @brief Builds and throws an exception with a printf-like formatted message
+ @hideinitializer */
+#define THROWF(c, v, ...) _XBT_THROW(c, v, bprintf(__VA_ARGS__))