// I know you're code isn't doing something like this,
// but it shows another drawback of macros vs functions
#include <iostream>
#define MACRO_ABS(p) ((p) < 0 ? -(p) : (p))
template <typename T>
T function_abs(T p)
{
return p < 0 ? -p : p;
}
int main()
{
int i = -100;
std::cout << "macro: " << MACRO_ABS(i++) << std::endl;
std::cout << "i: " << i << std::endl;
i = -100;
std::cout << "function: " << function_abs(i++) << std::endl;
std::cout << "i: " << i << std::endl;
}
Ly8gSSBrbm93IHlvdSdyZSBjb2RlIGlzbid0IGRvaW5nIHNvbWV0aGluZyBsaWtlIHRoaXMsCi8vIGJ1dCBpdCBzaG93cyBhbm90aGVyIGRyYXdiYWNrIG9mIG1hY3JvcyB2cyBmdW5jdGlvbnMKI2luY2x1ZGUgPGlvc3RyZWFtPgoKI2RlZmluZSBNQUNST19BQlMocCkgKChwKSA8IDAgPyAtKHApIDogKHApKQoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+ClQgZnVuY3Rpb25fYWJzKFQgcCkKewogICAgcmV0dXJuIHAgPCAwID8gLXAgOiBwOwp9CgppbnQgbWFpbigpCnsKICAgIGludCBpID0gLTEwMDsKCiAgICBzdGQ6OmNvdXQgPDwgIm1hY3JvOiAiIDw8IE1BQ1JPX0FCUyhpKyspIDw8IHN0ZDo6ZW5kbDsKICAgIHN0ZDo6Y291dCA8PCAiaTogIiA8PCBpIDw8IHN0ZDo6ZW5kbDsKCiAgICBpID0gLTEwMDsKCiAgICBzdGQ6OmNvdXQgPDwgImZ1bmN0aW9uOiAiIDw8IGZ1bmN0aW9uX2FicyhpKyspIDw8IHN0ZDo6ZW5kbDsKICAgIHN0ZDo6Y291dCA8PCAiaTogIiA8PCBpIDw8IHN0ZDo6ZW5kbDsKfQ==