- 1
- 2
- 3
- 4
- 5
- 6
- 7
#define LengthOfArrayInternal(a)(sizeof(a)/sizeof(a[0]))
#define is_array(x) _Generic((x), typeof((x)[0])[LengthOfArrayInternal(x)]:1, default: 0)
#define COMPILE_TIME_ASSERT(expr) char constraint[expr]
#define length_of_array(a) ({COMPILE_TIME_ASSERT(is_array(a)); LengthOfArrayInternal(a)})
LispGovno 15.11.2012 22:46 # −3
3.14159265 15.11.2012 22:53 # +5
Неужели день прошел без того, чтобы Гумно не запостило очередной херни.
LispGovno 15.11.2012 22:59 # −4
bormand 15.11.2012 23:12 # +3
Знать длину массива и при этом не заводить константу под нее нужно только в одном случае - инициализированный массив неизвестной длины: А этих случаев во-первых не так много, во-вторых если он все-таки будет перепилен на указатель, тебе все равно придется где-то хранить длину, и втыкать ее вместо sizeof().
LispGovno 15.11.2012 23:24 # −1
В соседнем треде
http://govnokod.ru/12108#comment160879
, из которого вырос этот тред, сказали, что создатели google chrome используют плохоработающий COUNT_OF. Скажи это им.
bormand 16.11.2012 07:18 # +3
http://ideone.com/N9FpVB Для массива &a и a равны, а у всех остальных типов нет. Проверка надежная, но, к сожалению, в райнтайме.
LispGovno 16.11.2012 07:48 # −1
LispGovno 16.11.2012 07:58 # −1
absolut 16.11.2012 09:03 # +3
и, кстати, если значение переменной совпадает с адресом, это может быть и не массив, а случайное совпадение :)
http://ideone.com/WPiT43
bormand 16.11.2012 08:02 # +1
Тестил на gcc с -Wall -Wextra -pedantic -std=c89 и до кучи на -ansi, поэтому скорее всего должно заработать и на визуалке и других компиляторах.
P.S. В режиме с++ этот макрос использовать нельзя.
P.P.S. В хидерах тоже использовать нельзя. Если очень хочется - нужно __LINE__ поменять на __COUNTER__, который не кроссплатформа.
LispGovno 16.11.2012 08:06 # 0
bormand 16.11.2012 08:14 # +1
P.S. Разве что найти какую-то хрень, которая не будет компилиться внутри выражений в зависимости от какого-то параметра...
LispGovno 16.11.2012 08:39 # 0
Первое, что приходит в голову - ошибка компиляции при преобразовании типов, но как заставить макрос в зависимости от условия вернуть переменную нужного типа?
upd: А впрочем я кажется знаю.
LispGovno 16.11.2012 08:47 # 0
bormand 16.11.2012 08:55 # +1
http://ideone.com/N7MZ4R
За неимением лучшего.
LispGovno 16.11.2012 09:13 # −1
http://ideone.com/j2dVoo
LispGovno 16.11.2012 09:14 # −1
LispGovno 16.11.2012 09:18 # −1
http://ideone.com/grht3g
К сожалению эта реализация это не делает. Можно конечно энум использовать для взврата значения, но тогда она не сможет выдавать длину массива времени выполнения.
LispGovno 16.11.2012 09:22 # −1
- длина времени выполнения
LispGovno 15.11.2012 22:57 # 0
typeof и statement in expression - gcc extension
roman-kashitsyn 15.11.2012 23:25 # +3
Сишка - отличный язык. Да, компилятор делает для тебя не так много работы, зато язык по большей части очень прост и не перегружен абстракциями и парадигмами.
Он для людей, которые решают задачи, а не школьников, которые хвалятся на геймдеве очередным крестовысером.
Хотя и кресты можно использовать правильно, если подойти к этому с головой.
LispGovno 15.11.2012 23:28 # −3
bormand 15.11.2012 23:43 # +3
LispGovno 15.11.2012 23:52 # −2
Видать тоже крестолюб.
bormand 16.11.2012 06:58 # +3
А я этого и не отрицал.
LispGovno 16.11.2012 11:03 # +1
Ты крестолюб.
TarasB 16.11.2012 11:53 # +2
LispGovno 16.11.2012 00:04 # −2
Я за всю жизнь не то что-бы кинуть, даже случайно уронить флешку с крестопримером не смог. А ты говоришь кидал.
defecate-plusplus 15.11.2012 23:55 # +5
TarasB 16.11.2012 09:53 # +1
Например
LispGovno 16.11.2012 11:02 # 0
TarasB 16.11.2012 11:17 # +1
LispGovno 16.11.2012 11:19 # 0
bormand 16.11.2012 11:22 # 0
Да ну. Если не изменяет память можно вообще libc отстегнуть и писать на голых syscall'ах/winapi.
А рантайм крестов в гцц это libstdc++, по дефолту он не пристегивается.
LispGovno 16.11.2012 11:28 # −3
TarasB 16.11.2012 11:42 # 0
LispGovno 16.11.2012 11:50 # 0
TarasB 16.11.2012 11:52 # 0
LispGovno 16.11.2012 11:55 # 0
TarasB 16.11.2012 11:23 # 0
LispGovno 16.11.2012 11:26 # −2
LispGovno 16.11.2012 11:21 # −3
TarasB 16.11.2012 11:22 # 0
TarasB 16.11.2012 11:44 # 0
roman-kashitsyn 16.11.2012 11:45 # +2
defecate-plusplus 16.11.2012 11:54 # +3
а что, зеленым на говнокоде теперь выделяется асм?
TarasB 16.11.2012 12:15 # 0
> точка с запятой и до конца строки
LispGovno 16.11.2012 08:00 # −1