Macros have no typechecking. It's just text expansion.
Most compilers these days will inline simple functions, so don't
use macros instead of functions in the name of "efficiency."
inline size_t bytes_needed( size_t n, size_t typesize ) {
return n * typesize;
}
const size_t buffersize = bytes_needed( nusers, sizeof(struct User));
gcc -E will preprocess to stdout, so you can see exactly what
the effects of your macros are.