вообще изумляюсь, как тут некоторые пытаются добится бана procoder99, вместо того, чтобы подробно разбирать его код (я серьезно, без иронии)
с другой стороны, г-н procoder99, я тебе напомню, что девелопмент — это не талксы, так что воздержись от своих филосовских излияний про ашотов, жизнь царей и прочее; кроме того, чтобы у тебя не было желания постить то, что всем уже *приелось*, вот краткая сводка твоих точек зрения и моих ответов на них:
А. «люди/преподы_в_вузах/... отвечают „делай как все“ вместо того, чтобы разобрать конкретный подход, указанный procoder99-ом» — да, такая проблема есть, но на лор-е имеются люди, которые именно разбирают подход (скажем, это я), так что прекрати свои жалобные стоны на эту тему
В. «procoder99-а не понимают, поскольку он гениален, а гениален он именно потому, что его не понимают» /сарказм/ — ну так прекрати стонать и демонстрируй свой код, мнение людей может измениться
С. если вдруг че-то у тебя потерли, не стесняйся посмотреть свой удаленный коммент, почистить его от рассказов про жизнь царей, ашотов и прочего, и запостить заново самое ценное из него (скажем, обоснование того, почему твой код будет работать быстрее, чем код оппонента)
теперь переходим к разбору твоего foreach
1. это вообще код не на си
2. твой код хуже чем for(... : ...), т.к. твой код МОЛЧА ломается от разумного использования
3. твой код хуже чем for(... : ...), т.к. твой код МОЛЧА ломается от данных, которые легко могут в него попасть, а for(... : ...) выдает диагностику
так что код, получается, у царей не ахти... впрочем, ты можешь предоставить исправленный вариант
твой код ( foreach в c++ (комментарий) ):
#include <stdio.h>
#include <stdint.h>
#define foreach(a, b)\
for(typeof(*(b)) * (a) = (b); (a) != ((b) + (sizeof((b))/sizeof(typeof(*(b))))); ++(a))
int main() {
uint32_t vec[] = {123, 124, 125};
foreach(it, vec)
fprintf(stdout, "%u\n", *it);
return 0;
}
1. это вообще код не на си, а на гнутых расширениях
$ gcc coder.c
coder.c: In function ‘main’:
coder.c:8: error: ‘for’ loop initial declarations are only allowed in C99 mode
coder.c:8: note: use option -std=c99 or -std=gnu99 to compile your code
$ gcc -std=c99 coder.c
coder.c: In function ‘main’:
coder.c:8: warning: implicit declaration of function ‘typeof’
coder.c:8: error: ‘it’ undeclared (first use in this function)
coder.c:8: error: (Each undeclared identifier is reported only once
coder.c:8: error: for each function it appears in.)
2. твой хуже чем for(... : ...), т.к. твой код МОЛЧА ломается от разумного использования
#include <stdio.h>
#include <stdint.h>
#define foreach(a, b)\
for(typeof(*(b)) * (a) = (b); (a) != ((b) + (sizeof((b))/sizeof(typeof(*(b))))); ++(a))
int main() {
uint32_t vec[6][3] = {
{10, 11, 12},
{20, 21, 22},
{30, 31, 32},
{40, 41, 42},
{50, 51, 52},
{60, 61, 62},
};
int i=0, j=0;
foreach(it, vec[++i]) {
fprintf(stdout, "%u\n", *it);
if( ++j>5 ) return 0; /// а иначе у тебя сегфолт
}
return 0;
}
$ gcc -std=gnu99 coder-er2.c
$ ./a.out
20
21
22
30
31
32
в то время как правильный результат это «20\n21\n22\n» ( http://ideone.com/JbO2Ns )
почему этот результат правильный, а твой нет — потому, что внутри своей реализации ты можешь хоть 1, хоть 2, хоть 100500 раз делать копирование, но снаружи твоего макроса это вообще не должно быть видно
3. твой хуже чем for(... : ...), т.к. твой код, т.к. твой код МОЛЧА ломается от данных, которые легко могут в него попасть, а for(... : ...) выдает диагностику (диагностика g++ 4.7 на http://ideone.com/0vQk95 )
#include <stdio.h>
#include <stdint.h>
#define foreach(a, b)\
for(typeof(*(b)) * (a) = (b); (a) != ((b) + (sizeof((b))/sizeof(typeof(*(b))))); ++(a))
int main() {
uint32_t vec[] = {123, 124, 125};
uint32_t *ptr = vec;
foreach(it, ptr)
fprintf(stdout, "%u\n", *it);
return 0;
}
$ gcc -std=gnu99 coder-er3.c
$ ./a.out
123
Перемещено Pinkbyte из development