#define RESOURCEHOLDER(DEFINITIONS, ENTRYCODE, EXITCODE, OBJECTNAME)\
struct RESOURCEHOLDER_##OBJECTNAME{\
DEFINITIONS\
RESOURCEHOLDER_##OBJECTNAME(){\
ENTRYCODE\
}\
~RESOURCEHOLDER_##OBJECTNAME(){\
EXITCODE\
}\
}OBJECTNAME
//Anwendungsbeispiel
#include <iostream>
#include <string>
using std::cout;
using std::string;
int main(){
//2 Resourcen im selben scope:
RESOURCEHOLDER(int i;, i = 5; cout << "RESOURCEHOLDER initialized\n";, cout << "RESOURCEHOLDER destroyed " << i << '\n';, rh);
cout << rh.i << '\n';
rh.i += 2;
RESOURCEHOLDER(double j;, j = 12.; cout << "RESOURCEHOLDER initialized\n";, cout << "RESOURCEHOLDER destroyed " << j << '\n';, rh2);
cout << rh2.j << '\n';
rh2.j += 3;
{
//ich könnte schwören struct RESOURCEHOLDER_rh ist doppelt definiert, aber weder VS2010E noch gcc 4.3.4 stören sich dran
RESOURCEHOLDER(string s;, s = "Hello world"; cout << "RESOURCEHOLDER initialized\n";, cout << "RESOURCEHOLDER destroyed " << s << '\n';, rh);
cout << rh.s << '\n';
rh.s += "!!!";
}
}
I2RlZmluZSBSRVNPVVJDRUhPTERFUihERUZJTklUSU9OUywgRU5UUllDT0RFLCBFWElUQ09ERSwgT0JKRUNUTkFNRSlcCiAgICBzdHJ1Y3QgUkVTT1VSQ0VIT0xERVJfIyNPQkpFQ1ROQU1Fe1wKICAgIAlERUZJTklUSU9OU1wKCQlSRVNPVVJDRUhPTERFUl8jI09CSkVDVE5BTUUoKXtcCgkJCUVOVFJZQ09ERVwKCQl9XAoJCX5SRVNPVVJDRUhPTERFUl8jI09CSkVDVE5BTUUoKXtcCgkJCUVYSVRDT0RFXAoJCX1cCgl9T0JKRUNUTkFNRQoKLy9BbndlbmR1bmdzYmVpc3BpZWwKI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgp1c2luZyBzdGQ6OmNvdXQ7CnVzaW5nIHN0ZDo6c3RyaW5nOwppbnQgbWFpbigpewoJLy8yIFJlc291cmNlbiBpbSBzZWxiZW4gc2NvcGU6CglSRVNPVVJDRUhPTERFUihpbnQgaTssIGkgPSA1OyBjb3V0IDw8ICJSRVNPVVJDRUhPTERFUiBpbml0aWFsaXplZFxuIjssIGNvdXQgPDwgIlJFU09VUkNFSE9MREVSIGRlc3Ryb3llZCAiIDw8IGkgPDwgJ1xuJzssIHJoKTsKCWNvdXQgPDwgcmguaSA8PCAnXG4nOwoJcmguaSArPSAyOwoJUkVTT1VSQ0VIT0xERVIoZG91YmxlIGo7LCBqID0gMTIuOyBjb3V0IDw8ICJSRVNPVVJDRUhPTERFUiBpbml0aWFsaXplZFxuIjssIGNvdXQgPDwgIlJFU09VUkNFSE9MREVSIGRlc3Ryb3llZCAiIDw8IGogPDwgJ1xuJzssIHJoMik7Cgljb3V0IDw8IHJoMi5qIDw8ICdcbic7CglyaDIuaiArPSAzOwoJewoJCS8vaWNoIGvDtm5udGUgc2Nod8O2cmVuIHN0cnVjdCBSRVNPVVJDRUhPTERFUl9yaCBpc3QgZG9wcGVsdCBkZWZpbmllcnQsIGFiZXIgd2VkZXIgVlMyMDEwRSBub2NoIGdjYyA0LjMuNCBzdMO2cmVuIHNpY2ggZHJhbgoJCVJFU09VUkNFSE9MREVSKHN0cmluZyBzOywgcyA9ICJIZWxsbyB3b3JsZCI7IGNvdXQgPDwgIlJFU09VUkNFSE9MREVSIGluaXRpYWxpemVkXG4iOywgY291dCA8PCAiUkVTT1VSQ0VIT0xERVIgZGVzdHJveWVkICIgPDwgcyA8PCAnXG4nOywgcmgpOwoJCWNvdXQgPDwgcmgucyA8PCAnXG4nOwoJCXJoLnMgKz0gIiEhISI7Cgl9Cn0K