LINUX.ORG.RU
Ответ на: комментарий от Sylvia

вообщем выбирайте нужное )

 Warning Options
           -fsyntax-only  -pedantic  -pedantic-errors -w  -Wextra  -Wall  -Waddress
           -Waggregate-return  -Warray-bounds -Wno-attributes -Wno-builtin-macro-redefined
           -Wc++-compat -Wc++0x-compat -Wcast-align  -Wcast-qual -Wchar-subscripts -Wclobbered
           -Wcomment -Wconversion  -Wcoverage-mismatch  -Wno-deprecated -Wno-deprecated-declarations
           -Wdisabled-optimization -Wno-div-by-zero -Wempty-body  -Wenum-compare -Wno-endif-labels
           -Werror  -Werror=* -Wfatal-errors  -Wfloat-equal  -Wformat  -Wformat=2
           -Wno-format-contains-nul -Wno-format-extra-args -Wformat-nonliteral -Wformat-security
           -Wformat-y2k -Wframe-larger-than=len -Wignored-qualifiers -Wimplicit
           -Wimplicit-function-declaration  -Wimplicit-int -Winit-self  -Winline
           -Wno-int-to-pointer-cast -Wno-invalid-offsetof -Winvalid-pch -Wlarger-than=len
           -Wunsafe-loop-optimizations -Wlogical-op -Wlong-long -Wmain  -Wmissing-braces
           -Wmissing-field-initializers -Wmissing-format-attribute  -Wmissing-include-dirs
           -Wmissing-noreturn  -Wno-mudflap -Wno-multichar  -Wnonnull  -Wno-overflow
           -Woverlength-strings  -Wpacked  -Wpacked-bitfield-compat  -Wpadded -Wparentheses
           -Wpedantic-ms-format -Wno-pedantic-ms-format -Wpointer-arith  -Wno-pointer-to-int-cast
           -Wredundant-decls -Wreturn-type  -Wsequence-point  -Wshadow -Wsign-compare
           -Wsign-conversion  -Wstack-protector -Wstrict-aliasing -Wstrict-aliasing=n
           -Wstrict-overflow -Wstrict-overflow=n -Wswitch  -Wswitch-default  -Wswitch-enum
           -Wsync-nand -Wsystem-headers  -Wtrigraphs  -Wtype-limits  -Wundef  -Wuninitialized
           -Wunknown-pragmas  -Wno-pragmas -Wunreachable-code -Wunused  -Wunused-function
           -Wunused-label  -Wunused-parameter -Wunused-value  -Wunused-variable -Wvariadic-macros
           -Wvla -Wvolatile-register-var  -Wwrite-strings

Sylvia ★★★★★
()
Ответ на: комментарий от Sylvia

Ну раз Вы меня так любите носом в маны тыкнуть рекомендую почитать что там написано по поводу этой директивы поподробней ;)

mskmsk1985
() автор топика
Ответ на: комментарий от Sylvia

И что все перебирать что-ли? Я такой путь и сам знаю только вот офонарею от этого мероприятия раньше.

mskmsk1985
() автор топика

Я бы не давил компилятор а подумал бы зачем указатель функции к объекту приводить ?? какие последствия данного кастинга..

alexsy ★★
()

правильно написать код и варнингов не будет. если код не собирается с «-Wall -Wextra -Werror», то это быдлокод, а не код…

arsi ★★★★★
()
Ответ на: комментарий от namezys

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

Ты как приводишь?

namezys ★★★★
()
Ответ на: комментарий от arsi

> правильно написать код и варнингов не будет. если код не собирается с «-Wall -Wextra -Werror», то это быдлокод, а не код…

добавь к этому ещё -pedantic

SSN
()
Ответ на: комментарий от SSN

> добавь к этому ещё -pedantic

-pedantic-errors же :)

arsi ★★★★★
()
Ответ на: комментарий от lester

http://www.opengroup.org/onlinepubs/009695399/functions/dlsym.html

The ISO C standard does not require that pointers to functions can be cast back and forth to pointers to data. Indeed, the ISO C standard does not require that an object of type void * can hold a pointer to a function. Implementations supporting the XSI extension, however, do require that an object of type void * can hold a pointer to a function. The result of converting a pointer to a function into a pointer to another data type (except void *) is still undefined, however. Note that compilers conforming to the ISO C standard are required to generate a warning if a conversion from a void * pointer to a function pointer is attempted as in:

fptr = (int (*)(int))dlsym(handle, «my_function»);

Due to the problem noted here, a future version may either add a new function to return function pointers, or the current interface may be deprecated in favor of two new functions: one that returns data pointers and the other that returns function pointers.

summatus
()
Ответ на: комментарий от summatus

спасибо конечно, но я спросил пример кода ТС не для этого

lester ★★★★
()
Ответ на: комментарий от summatus

> ISO C++ forbids casting between pointer-to-function and pointer-to-object

Тебе это что нить говорит? Там С++, а не С

namezys ★★★★
()
Ответ на: комментарий от arsi

Угу, так и делаю.

template < class FunctionPtr >
FunctionPtr union_cast( void* objectPtr ) {
    union {
        void* obj;
        FunctionPtr func;
    } var;

    var.obj = objectPtr;
    return var.func;
}

А можно просто -pedantic отключить.

summatus
()
Ответ на: комментарий от summatus

А reinterpret_cast не пробовал? система его пропустит. И читабельнее будет.

Но перед этим лучше бы static assert сделать

namezys ★★★★
()
Ответ на: комментарий от summatus

> А можно просто -pedantic отключить.

а если ведущий проекта сказал, что низя? ;)

arsi ★★★★★
()
Ответ на: комментарий от arsi

>правильно написать код и варнингов не будет. если код не собирается с «-Wall -Wextra -Werror», то это быдлокод, а не код…
Ты, мальчик, видимо никогда не работал над кроссплатформенными проктами...

anotheranonymous
()
Ответ на: комментарий от anotheranonymous

> Ты, мальчик, видимо никогда не работал над кроссплатформенными проктами...

А что это мешает писать правильный код?

namezys ★★★★
()
Ответ на: комментарий от namezys

Ну давай пример правильного использования dlsym в плюсовом коде.

ЗЫ: да нужно во время выполнения подгрузить либу поюзать её и выгрузить, прилинковывать к прожекту её нельзя так как на этапе сборки проекта эта либа просто неизвестна, её нет.

mskmsk1985
() автор топика
Ответ на: комментарий от mskmsk1985

А что, reintrept_cast вызывает варнинги? Да. Каждый раз надо убедиться, что именно этот код выполнит получение указателя на функу - но на это же есть тесты

namezys ★★★★
()
Ответ на: комментарий от anotheranonymous

> Ты, мальчик, видимо никогда не работал над кроссплатформенными проктами...

FailExeption fail; fail.setAttribute(«epic», true); throw(fail);

arsi ★★★★★
()
Ответ на: комментарий от summatus

> Indeed, the ISO C standard does not require that an object of type void * can hold a pointer to a function.

Это требование есть в POSIX.

LamerOk ★★★★★
()
Ответ на: комментарий от namezys

А что ты умеешь заставить компилятор скомпилировать такой код без reiterpret_cast? Поделишься как?

mskmsk1985
() автор топика
Ответ на: комментарий от mskmsk1985

> Ну давай пример правильного использования dlsym в плюсовом коде.

пример, не зависящий от плюсонутости кода:

typedef void (*abstract_func_ptr)();

abstract_func_ptr my_dlsym_for_func(void *handle, const char *symbol) {
    union { void *ptr; abstract_func_ptr fnp; } f;
    f.ptr = dlsym(handle, symbol);
    return f.fnp;
}

typedef int (*my_func_ptr)(int);

my_func_ptr my_func = (my_func_ptr) my_dlsym_for_func(handle, "my_func");

не вызывает ни «ошибка: ISO C запрещает преобразование указателя на объект к указателю на функцию», ни «ошибка: ISO C++ не поддерживает приведение типа указателя на функцию к указателю на объект», при «-ansi -pedantic-errors -Wall -Wextra -Werror».

arsi ★★★★★
()
Ответ на: комментарий от arsi

не вызывает не одного предупреждения. Падает от любого движения левой ноги разработчика компилятора.

reintrept_cast хоть размерности данных проверит (если я не ошибаюсь), И статически упадет, если sizeof(void*) > sizeof(abstract_func_ptr)

Зачем тут такой грязные хак?

namezys ★★★★
()
Ответ на: комментарий от arsi

> my_func_ptr my_func = (my_func_ptr) my_dlsym_for_func(handle, «my_func»);

А вообще вот это что такое? Какое преобразование типа будет вызвано при c-style cast?

namezys ★★★★
()
Ответ на: комментарий от namezys

> Зачем тут такой грязные хак?

mskmsk1985> А что ты умеешь заставить компилятор скомпилировать такой код без reiterpret_cast? Поделишься как?

arsi ★★★★★
()
Ответ на: комментарий от arsi

Это я понял зачем. Просто ты не несколько раз этот пример приводил. Я вот сижу и думаю - может я что-то не понимаю.

namezys ★★★★
()

Избегать «casting between pointer-to-function and pointer-to-object»

ip1981 ☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.