std::accumulate alternative for the C programming language
When using the do { ... } while (0) idiom for macros, we don't generally include the terminating semicolon in the definition.  That's so we can use it like a function call:
if (condition)
    ACCUMULATE(result, a, b, 0, add);
else
    ACCUMULATE(result, a, c, 10, add);

There's a typo in the ARRSIZE() macro: where we protect X from misbinding - should be (X)[0], not (X[0]):
#define ARRSIZE(X) (sizeof (X) / sizeof (X)[0])

Also, be careful with this macro when its argument isn't a whole, completely defined array.  In particular, it will be wrong when the argument is a variable-length (dynamically-allocated) array, or when the argument is a pointer (perhaps the array decayed to pointer - that can easily catch you out!).
In the sample usage:

Identifiers ending in _t are reserved for future use by the standard library, so str_t should be renamed.
It's a shame, after being so careful to use snprintf() avoid overflow, that we  we then use unchecked strcat();strcat();strcat(); in sumStr()  - why not snprintf() there, too?
A lot of needless parens around the arguments to sizeof.  Just write sizeof sumstr instead of sizeof(sumstr), for example.