препроцессор понимает тернарные выражения?
От: niXman Ниоткуда https://github.com/niXman
Дата: 03.11.21 20:57
Оценка:
привет!

наткнулся на такое:
# if defined __cplusplus ? __GNUC_PREREQ (2, 6) : __GNUC_PREREQ (2, 4)
#   define __ASSERT_FUNCTION    __extension__ __PRETTY_FUNCTION__
# else
#  if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
#   define __ASSERT_FUNCTION    __func__
#  else
#   define __ASSERT_FUNCTION    ((const char *) 0)
#  endif
# endif

(отсюда: https://github.com/bminor/glibc/blob/master/assert/assert.h#L125)

обратите внимание на первую строку приведенного кода.
я единственный такой кто впервые видит чтоб препроцессор понимат тернарки?


спасибо.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: препроцессор понимает тернарные выражения?
От: kov_serg Россия  
Дата: 03.11.21 21:55
Оценка:
Здравствуйте, niXman, Вы писали:

X>наткнулся на такое:

X>
# if defined __cplusplus ? __GNUC_PREREQ (2, 6) : __GNUC_PREREQ (2, 4)

X>обратите внимание на первую строку приведенного кода.
X>я единственный такой кто впервые видит чтоб препроцессор понимат тернарки?
Вы просто не стой стороны посмотрели
#if выражения понимает

так лучше видно
#if defined(something)
Re: препроцессор понимает тернарные выражения?
От: reversecode google
Дата: 03.11.21 22:01
Оценка:
там кнопочка есть blame
https://github.com/bminor/glibc/commit/d0db5f488d9a47947c49f728ca29077c0cff48b1
Re[2]: препроцессор понимает тернарные выражения?
От: niXman Ниоткуда https://github.com/niXman
Дата: 04.11.21 06:13
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>так лучше видно

_>
_>#if defined(something)
_>


а так лучше видно?
# if 1 ? __GNUC_PREREQ (2, 6) : __GNUC_PREREQ (2, 4)

только я тут вижу тернарку?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[3]: препроцессор понимает тернарные выражения?
От: kov_serg Россия  
Дата: 04.11.21 09:25
Оценка:
Здравствуйте, niXman, Вы писали:

X>а так лучше видно?

# if 1 ? __GNUC_PREREQ (2, 6) : __GNUC_PREREQ (2, 4)

X>только я тут вижу тернарку?
там написано если компилятор C++ то порерить что gnuc 2.6 или выше, а если C то мпроверить что gnuc 2.4 или выше
для C надо gnuc 2.4+, для C++ 2.6+ если это выполняется то заходим внутрь ифа.

#if expression
expression = exp1 ? exp2 : exp3
exp1 = defined MACROS
MACROS = __cplusplus
exp2 = __GNUC_PREREQ (2, 6)
exp3 = __GNUC_PREREQ (2, 4)

/* Convenience macro to test the version of gcc.
   Use like this:
   #if __GNUC_PREREQ (2,8)
   ... code requiring gcc 2.8 or later ...
   #endif
   Note: only works for GCC 2.0 and later, because __GNUC_MINOR__ was
   added in 2.0.  */
#if defined __GNUC__ && defined __GNUC_MINOR__
# define __GNUC_PREREQ(maj, min) \
        ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
#else
# define __GNUC_PREREQ(maj, min) 0
#endif


Так нагляднее?
Re[4]: препроцессор понимает тернарные выражения?
От: niXman Ниоткуда https://github.com/niXman
Дата: 04.11.21 09:49
Оценка:
я наверное на каком-то странном языке пишу...

# if 1 ? __GNUC_PREREQ (2, 6) : __GNUC_PREREQ (2, 4)

это тернарное выражение? (https://en.wikipedia.org/wiki/%3F:)
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Отредактировано 04.11.2021 9:51 niXman . Предыдущая версия .
Re[5]: препроцессор понимает тернарные выражения?
От: kov_serg Россия  
Дата: 04.11.21 10:41
Оценка:
Здравствуйте, niXman, Вы писали:

X>
X># if 1 ? __GNUC_PREREQ (2, 6) : __GNUC_PREREQ (2, 4)
X>

X>это тернарное выражение? (https://en.wikipedia.org/wiki/%3F:)

А по вашему тернарный оператор это не expression ?
Re[2]: препроцессор понимает тернарные выражения?
От: B0FEE664  
Дата: 04.11.21 12:30
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Вы просто не стой стороны посмотрели

_>#if выражения понимает

Там по ссылке какая-то ерунда. Там написано, что:

Condition evaluation
#if, #elif
The expression is a constant expression.

и ссылка ведёт на страницу, где есть примеры с использованием шаблонов.
И каждый день — без права на ошибку...
Re: препроцессор понимает тернарные выражения?
От: _NN_ www.nemerleweb.com
Дата: 07.11.21 07:30
Оценка:
Здравствуйте, niXman, Вы писали:

X>привет!


X>обратите внимание на первую строку приведенного кода.

X>я единственный такой кто впервые видит чтоб препроцессор понимат тернарки?

Поддерживаю, за много лет опыта ни разу не понадобилось
Стандарт не против:

#if constant-expression new-line groupopt


constant-expression:
  conditional-expression


conditional-expression:
  logical-or-expression
  logical-or-expression ? expression : assignment-expression


P.S.
А если ещё учесть, что defined возвращает число то можно веселее писать
#define B 1
#define C 1

#if defined A ? B : B == defined C ? B : C
#endif
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.