Создайте еще один макрос для объявления этих переменных:
/* example.h */
#define MSGMacroDeclare(obj) extern MyPaymentClass obj;
MSGMacroDeclare(Card);
MSGMacroDeclare(Cash);
...
/* example.cpp */
#define MSGMacroDefine(obj, arg) extern MyPaymentClass obj(arg);
MSGMacroDefine(Card, 1);
MSGMacroDefine(Cash, 2);
...
В конце концов, если вы хотите, чтобы один и тот же файл объявлял и определял их, вы можете использовать sth так:
/* example.h */
#ifndef MSGMacro
#define MSGMacro(obj, arg) extern MyPaymentClass obj
#endif
MSGMacro(Card, 1);
MSGMacro(Cash, 2);
...
/* example.cpp */
#define MSGMacro(obj, arg) extern MyPaymentClass obj(arg)
#include "example.h"
но это имеет смысл только тогда, когда их много, много, много (много глобалов? Хммм ...) и список часто меняется, как правило, это необычно