Macros and templates in C++ differ in that macros do not perform type checking on parameters and can cause unexpected behavior when parameters are modified, while templates allow the compiler to verify type compatibility and do not have issues with parameter modification. Macros are expanded by the preprocessor before compilation, so errors refer to the expanded code rather than the macro definition. Templates undergo type checking and retain the template parameter types.