gcc/clangでは拡張で式文がつかえるが、これはC++11で入ったlambdaで同じことができるし、オブジェクトとして扱えるとかキャプチャがあるとかでむしろ高機能なのだが、デバッグで一時的に文字列を生成したいときにalloca()で領域確保したいときにlambdaは使えなかった。
#include <iostream> #include <string.h> #include <stdlib.h> int main() { char *p1 = ({ char* p = (char*)alloca(100); strcpy(p, "aaa"); p; }); char *p2 = ([]() { char* p = (char*)alloca(100); strcpy(p, "bbb"); return p; })(); std::cout << p1 << std::endl; std::cout << p2 << std::endl; }
% clang++ -std=gnu++11 foo.cc % ./a.out aaa %