Обновить
70
Pavel Odintsov@pavelodintsov

Software developer in love with network security

73
Подписчики
Отправить сообщение
За то, что откровенно барыжить подобными данными среди проектов сообщества не принято. Вы же не хотите, чтобы, скажем, корневая зона домен .ru продала кому-то информацию, за какими доменами Вы ходите к ним?
Отличное исследование и важная тема.
Как и обещал включил -pedantic и разметил везде, где используются расширения этот факт явно:

-                struct __attribute__((__packed__))  {
+                __extension__ struct __attribute__((__packed__))  {
В перл критике много упоротых вещей — его нужно употреблять ограничено :)
Буду бесконечно благодарен :)
Интересный ход. Но я не уверен, что понимаю подоплеку. Ведь сейчас каждый за два вечера сможет собрать Nginx Plus на базе модулей!
А может осилите отдельную крутую статью по расширениям? :) Дабы такая чудная магия не прозябала! Ведь задача тут одна — описать как можно лучше то, что в машинном коде реализуется нэтивно. И когда смотришь решения — тот же мультикейс напрашивается сам собой…
Да, согласен, увидь я что-то такое в чужом коде — удивился бы довольно сильно. Explicit better than implicit :) Спасибо, хорошая штука, приведу свой код в соотвествии с этим подходом.
Я искренне предполагал, что они обе — расширение, был совершенно неправ.

Прогнал код с pedantic и получилось занятное:
anonymous structs are a GNU extension [-Wgnu-anonymous-struct]
anonymous types declared in an anonymous union are an extension [-Wnested-anon-types]


То есть экстеншенов у меня аж два. Один — сам по себе анонимный struct, второй — анонимный struct внутри анонимного union (стандартного).

Хех. Столько фич на пустом месте :)
Ага, тут верно. Ни один компилятор не ругается на анонимные union. Но вот в моем кейсе красиво обойтись без анонимного struct не получается.

Но сама пометка __extension__ — разве в стандарте? Вообще, довольно удобная фича, надо весь свой код переписать под pedantic :)
let's code.

cat anonumous_struct.cpp 
#include <iostream>

struct outer {
    struct {
        int a;
    };
};

int main() {
    return 0;
}


Стандартный компилятор из ubutnu 14.04:
g++ -v 2>&1|grep "gcc version"
gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04) 


g++ anonumous_struct.cpp  -pedantic 
anonumous_struct.cpp:6:5: warning: ISO C++ prohibits anonymous structs [-Wpedantic]
     };
     ^


Самый новый gcc 5.3.0:
/opt/fastnetmon/libraries/gcc530/bin/g++ -v 2>&1|grep version 
gcc version 5.3.0 (GCC) 


Результат:
/opt/fastnetmon/libraries/gcc530/bin/g++ anonumous_struct.cpp  -pedantic
anonumous_struct.cpp:6:5: warning: ISO C++ prohibits anonymous structs [-Wpedantic]
     };
     ^


Clang:
clang++ --version
Ubuntu clang version 3.4-1ubuntu3 (tags/RELEASE_34/final) (based on LLVM 3.4)
Target: x86_64-pc-linux-gnu
Thread model: posix


Итог:
clang++ anonumous_struct.cpp -pedantic
anonumous_struct.cpp:4:5: warning: anonymous structs are a GNU extension [-Wgnu-anonymous-struct]
    struct {
    ^
1 warning generated.



Я не верю в ошибку двух топовых С++ компиляторах одновременно. А в то, что Вы не правы — верю больше :) Если есть аргументы — прошу ссылку на стандарты, я в них плохо ориентируюсь и не могу сходу найти абзац описывающий данное поведение.
Для С++ — это экстеншен и -peadntic будет ругаться на это (вот так: «warning: ISO C++ prohibits anonymous structs [-Wpedantic]), для С99 — это дозволенная фича и он ругаться, соотвественно не будет :) Вообще я набил несколько шишек в попытках сделать то, что хочу без оверхеда по памяти: www.stableit.ru/2016/02/union-bit-fields-c.html
Ну кому нужен сахар — пишут на С++, при прочих равных и более высоком удобстве он генерирует ровно такой же по эффективности машинный код. Лично я предпочитаю С++.
Многие вещи нельзя понять, когда только начинаешь писать на С. Ну не пишут в книгах, а примеры кода на С — обычно поганейшие, потому что обычно там С 89 со всеми вытекающими. А Вот 99й стандарт просто прелесть :)
Ага, штука хорошая, самому набивать такое — тяжко. Я тут недавно озаботился обратной стороной стандартов — открыл для себя классные GNU extensions — anonymous union и struct. Жалко нет хорошего каталога расширений. Конечно, использовать вещи не из стандарта — плохо, но без указанных выше фич код становится крайне некрасивым…
Отличная статья :) А-то от старого С 89, когда читаешь глаза вытекают :)
Там написано «в одной функции».
Как выжимку из PBP можно использовать вот это: www.reg.ru/coding_standards Довольно грамотные рекомендации.

Но главная рекомендация для поддержки крупного проекта на Perl — никогда в жизни не писать на Perl что-либо длиннее сотни строк.

Информация

В рейтинге
Не участвует
Откуда
London, England - London, Великобритания
Зарегистрирован
Активность