Эмуляция выражений выписки GCC

Я вынужден использовать компилятор IAR EW430 v7.12 для встроенного проекта, и он официально поддерживает только c99.

Я хотел бы иметь возможность подражать выражениям выражения GCC в общих чертах любыми способами, кроме написания кучи выделенных встроенных функций.

Есть ли способ достичь этого? (возможно, используя MACRO-wizardry? Или эмулировать Lambdas или некоторые скрытые ключи компилятора, которые позволят это?) Очевидно, кроме изменения компилятора.

В частности, результат последнего утверждения составного выражения должен содержать как его значение типа И, так и не переданные в качестве макропараметра.

Я искал месяцы, но самое близкое, что я могу получить, это впечатляющая впечатляющая библиотека , но это кажется очень сложным.

c,lambda,closures,c-preprocessor,c99,

-1

Ответов: 2


int first = 1 , second = 2 , temp , new_first ; new_first = ( temp = second , second = first , first = temp ); ROP = 'текст'>
4 принят

Я понимаю, что это не тот ответ, который вы ищете, но так как вы спросили: «Есть ли способ достичь этого?», Я должен сказать, что ответ просто «Нет».

Не поймите меня неправильно - я знаю, что вы ищете, и почему вы этого хотите. Это очень крутая функция. Когда-то я пытался изобрести свой собственный C-подобный язык, и одной из моих целей было то, что каждое утверждение можно использовать в качестве выражения. Но эта функция просто не является частью C, и нет достойного способа подражать ей.

На самом деле вы можете легко доказать, что нет достойного способа подражать ему, потому что, если бы это было, gcc-людим не пришлось бы реализовывать эти сумасшедшие, нестандартные расширения.

Поэтому, если вы хотите использовать gcc и его расширения, обязательно используйте gcc и его расширения. Но если вы хотите писать в достаточно чистой C, вам просто нужно научиться жить без выражений оператора. «Когда в Риме делайте, как делают римляне». Все, что вам удастся достичь с помощью безумной макромагии, вероятно, (а) не будет удовлетворять ваше стремление к истинным выражениям выражений и (б) сделать обслуживание вашей программы кошмаром для всех, кто приходит за вами, и не понимает, что в этом хорошего ,

Вы говорите, что делаете встроенную работу, но уверены ли вы, что для вашей платформы нет порта gcc? (Я знаю, что вы сказали, что вы «вынуждены» использовать IAR, но вы также сказали, что это «игрушечный проект», поэтому, возможно, вы можете нарушить это правило. IAR всегда заставляет меня думать о лозунге Wikipedia «Игнорировать все правила» в любом случае . :-))

Но так как вы сказали, что делаете встроенную работу, это еще одна причина для того, чтобы отбить эту особенную особенность. Впечатление, которое я получаю, заключается в том, что одна из определяющих характеристик «встроенной работы» заключается в том, что она все же отказывается от использования половины языка, чтобы гарантировать использование только очень четко определенного, чрезвычайно безопасного подмножества. Поэтому я сомневаюсь, что расширение, такое как выражения выражений, будет работать для вашего проекта.


1

В комментариях вы разъясняете, что

Мое намерение состоит в том, чтобы по-настоящему (или как можно ближе) подражать выражениям выражений, которые будут использоваться всеми возможными способами, с каждым их имуществом.

Поэтому давайте посмотрим, как формируются выражения операторов и что они делают:

Составной оператор, заключенный в круглые скобки, может отображаться как выражение в GNU C. Это позволяет использовать в выражении циклы, переключатели и локальные переменные.

[...]

Последнее в составном выражении должно быть выражением, за которым следует точка с запятой; значение этого подвыражения служит значением всей конструкции.

( Документация GCC )

Для этого есть две ключевые части:

  • Конструкция построена вокруг составного оператора и, следовательно, может иметь все, что может иметь составной оператор.

  • Конструкция вычисляет значение.

Более того, вы прямо говорите

В частности, результат последнего оператора составного выражения должен содержать как его значение типа И, так и не переданные в качестве макропараметра.

Вы нарисовали себя в углу. Операторы C не являются выражениями, что означает, что они не оценивают значения. Именно поэтому выражения операторов GCC являются расширением. Значения не имеют связи, и в той степени, в которой их можно считать областью видимости, она ограничена выражениями, в которых они отображаются, и объектами, которые их хранят. Единственный способ передать значение из оператора - назначить его объекту соответствующего типа (и вы явно хотите избежать этого) или firstему (что требует, чтобы он был в функции).

Существуют и другие характеристики выражений высказываний, которые, возможно, привлекли ваш интерес к второму месту. В частности, поскольку вы воспитывали лямбды, я подозреваю, что вас интересует тот факт, что выражения выражений живут внутри контекста окружающего кода, так что, помимо прочего, они могут использовать идентификаторы, которые находятся в области видимости. Если это то, за чем вы после этого, вам, вероятно, нужно просто написать обычные блоки кода и предоставить переменные, в которых следует сообщать результат.

ОДНАКО, есть еще одна альтернатива, которая может дать вам немного того, что вам нужно. Вы можете вычислить несколько выражений поочередно, каждый из которых может использовать побочные эффекты предыдущих, используя оператор запятой. Например,

first

Результат является то , что значения new_firstи ifменяются местами, с результирующим новым значением firstбыть назначены temp. Конечно, это не допускает циклов, ifоператоров и т. Д. , И это особенно не означает объявления локальных переменных, например temp. Как я уже сказал, некоторые выражения выражения могут делать.

с, лямбда, затворы, с-препроцессор, C99,
Похожие вопросы
Яндекс.Метрика