Why not reduce the duplication and make the differences far more obvious:

                unsigned long u = t->Tdim * (unsigned long) s;
#if SCPP
                type_chksize(u);
#elif MARS
                if (t->Tdim && ((u / t->Tdim) != s || (long)u < 0))
                    assert(0);
#else
                assert(0);
#endif
                s = u;

Or, even better, introduce type_chksize for the MARS case and move the conditional logic inside there rather than here?