Я не понимаю, что здесь делает компилятор и почему он работает с кодом C ++
#include <cstdio>
int main()
{
printf( ({ // (1)
struct some_noize_struct {
// there may be another code
};
42;
"abc";
}) // (2)
);
return 0;
}
Тип выражения между (1) и (2) фигурными скобками — const char *. После некоторых экспериментов я понял, что тип (1) — (2) -экспрессии определяется последней частью.
Вот пример кода. Это работает на C ++ 11 и позже.
http://cpp.sh/5tb47
Мой вопрос: как это работает.
Как объясняет @HolyBlackCat, код, который вы перечислили, использует расширение компилятора GCC для C ++ (и для C), хотя позволяет использовать составные операторы в качестве выражений.
В вашем printf()
заявление, вы должны предоставить const char*
или же const char* &
выражение в качестве первого аргумента функции, например, printf("hello")
или же printf(getenv("PATH"))
, Расширение позволяет интерпретировать блок с фигурными скобками как такое выражение, используя последний оператор в блоке. Блок в вашем случае это:
{
struct some_noize_struct { 42 };
42;
"abc";
}
который имеет 3 заявления. Последнее утверждение является значением всего выражения, что означает, что printf()
видит, по сути, так же, как если бы вы набрали printf("abc")
,
Этот вид кода не является стандартным C ++ (C ++ 11 или любой другой версией) и не является стандартным C.
Я предлагаю вам написать сопровождающих веб-сайта «C ++ Shell» и попросить их отобразить точную командную строку компиляции, которую они используют, и / или убедиться, что они используют --std=c++11
компилировать код C ++ 11 — что, похоже, они не делают.
Других решений пока нет …