"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > C++ pode converter um ponteiro vazio em um ponteiro de função?

C++ pode converter um ponteiro vazio em um ponteiro de função?

Publicado em 2024-11-12
Navegar:730

Can C   Convert a Void Pointer to a Function Pointer?

Convertendo ponteiros vazios em ponteiros de função: uma possibilidade condicional em C

Problema

Obtendo um ponteiro vazio via dlsym(), o objetivo é invocar a função referenciada por esse ponteiro. A tentativa de conversão por meio de conversão usando static_cast ou reinterpret_cast falhou, ao contrário de uma conversão no estilo C.

Resposta

A conversão direta de um ponteiro nulo em um ponteiro de função não é permitida em C 98/03. No entanto, C 0x oferece suporte condicional, permitindo que uma implementação dite o comportamento.

Abordagem de comportamento indefinido:

Embora indefinido pelo padrão, o código a seguir pode funcionar em maioria das plataformas:

void *gptr = dlsym(some symbol..);
typedef void (*fptr)();
fptr my_fptr = reinterpret_cast(reinterpret_cast(gptr));

Alternativamente:

fptr my_ptr = 0;
reinterpret_cast(my_ptr) = gptr;

Abordagem complexa, mas portátil:

Este método explora o fato de que o endereço de um ponteiro de função é um ponteiro de objeto:

// Get address as object pointer
void (**object_ptr)() = &my_ptr;

// Convert to void** (also an object pointer)
void **ppv = reinterpret_cast(object_ptr);

// Store address from 'gptr' in memory cell pointed to by 'ppv'
*ppv = gptr;

Essa abordagem permanece indefinida no padrão, mas deve funcionar razoavelmente bem na maioria das implementações.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3