2015-03-23 4 views
2

Я пытаюсь это сделать (это возможно?) С компилятором GCC:Неопределенная функция зондирования

Specifiy функцию, но эту функцию, если не выполняется пункт в NULL. Пример:

extern void something(uint some); 

И если это нереализованная точка в значение NULL.

Так что можно проверить так:

something != NULL ? something(222) : etc.; 

Я хотел бы решение с кормушкой GCC (это может быть разрешимы с указателями на функции).

+0

Компилятор не имеет значения; вы заботитесь о компоновщике. Возможно, вы хотите попробовать 'dlopen' и' dlsym': http://tldp.org/HOWTO/Program-Library-HOWTO/dl-libraries.html –

ответ

5

Это определенно не переносимо, но gcc может сделать это со слабыми символами на некоторых платформах. Я знаю, что это работает на Linux и * BSD, но не работает на MacOS.

$ cat weak.c 
#include <stdio.h> 

extern int foo(void) __attribute__((__weak__)); 

int 
main(int argc, char **argv) 
{ 
    int x = foo ? foo() : 42; 

    printf("%d\n", x); 
    return 0; 
} 
$ cat weak2.c 
int 
foo(void) 
{ 
    return 17; 
} 
$ cc -o weak weak.c && ./weak 
42 
$ cc -o weak weak.c weak2.c && ./weak 
17 
$ 
2

Вы можете сделать это, используя атрибут GCC в weakref:

extern void something(int); 
static void something_else(int) __attribute__((weakref("something"))); 

int main() 
{ 
    if (something_else) 
    something_else(122); 
} 

Если something не определена в программе, то слабый псевдоним something_else будет иметь адрес, равный нулю. Если определено значение something, то он будет псевдонимом something_else.

1

По сути вы пытаетесь получить компилятор, чтобы найти функцию по адресу памяти 0 (NULL). Это невозможно сделать на C без конкретных конструкторских/компиляторных конструкций.

Один вопрос, хотя, почему вы когда-нибудь захотите это сделать. C - статический язык, поэтому, если вы знаете, что функция никогда не будет существовать во время компиляции, вы можете просто использовать предварительный процессор, чтобы рассказать остальной части программы об этом во время компиляции. В самом деле, эти виды подстановок времени компиляции являются именно тем, почему препроцессор существует в первую очередь.

Я хотел бы создать макрос, который вы определяете, если ваша функция существует следующим образом:

#define THE_SOMETHING_FUNCTION_EXISTS

Затем замените в любом месте вы бы испытывали на something == NULL с #ifdef вместо этого.

Конечно, если существование функции может измениться во время выполнения, тогда правильный способ реализовать поведение, которое вы хотите, - сделать something указателем на функцию.

Смежные вопросы