Какие правила стандарта C ++ 11 используются для определения типа выражения в ({…})

Я не понимаю, что здесь делает компилятор и почему он работает с кодом 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

Мой вопрос: как это работает.

0

Решение

Как объясняет @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 — что, похоже, они не делают.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]