используя #defines и передавая им функции - PullRequest
3 голосов
/ 25 января 2010

gcc 4.4.2 c89

Я перепроектировал некоторый код в c89. Однако я полностью запутался в коде, который использует следующие #defines. Поэтому я создал небольшое приложение, которое, возможно, я бы лучше понял, как это работает.

Из того, что я могу собрать, MODULE_API передаст имя функции и вызовет макрос MODULE_SOURCE_API и объединит name и func. Поэтому я создал простую функцию с именем print_name и запустил код. Я получил следующие сообщения об ошибках:

implicit declaration of function ‘print_name’
undefined reference to `print_name'

Какая главная причина для этого?

#include <stdio.h>

#define MODULE_SOURCE_API(name, func) name##_##func
#define MODULE_API(func) MODULE_SOURCE_API(mod_print, func)

void MODULE_API(print_name)(const char const *name);

int main(void)
{
    printf("=== Start program ===\n");

    print_name("Joe bloggs");

    printf("== End of program ===\n");

    return 0;
}

void MODULE_API(print_name)(const char const *name)
{
    printf("My name is [ %s ]\n", name);

}

Большое спасибо за любой совет,

РЕДАКТИРОВАТЬ ==== Я только что сделал исправление, я должен звонить

MODULE_API(print_name)("Joe Bloggs");

Но как я могу распечатать, каков будет результат объединения? И с чем это связано?

Большое спасибо,

Ответы [ 2 ]

3 голосов
/ 25 января 2010
#define MODULE_SOURCE_API(name, func) name##_##func
#define MODULE_API(func) MODULE_SOURCE_API(mod_print, func)

 void MODULE_API(print_name)(const char const *name);

Это будет производить функцию с именем mod_print_print_name вместо print_name

Вы можете проверить это на gcc с опцией -E.

gcc -E ak.c дает

/* ...... */
void mod_print_print_name(const char const *name);

int main(void)
{
   printf("=== Start program ===\n");

   print_name("Joe bloggs");

   printf("== End of program ===\n");

   return 0;
}

void mod_print_print_name(const char const *name)
{
   printf("My name is [ %s ]\n", name);

}
3 голосов
/ 25 января 2010

Вы можете попытаться вручную развернуть макросы, чтобы понять, что происходит:

void MODULE_API( print_name )( const char * name ); // the second const there is redundant
                 // maybe you meant 'const char * const??

=(expand MODULE_API)=>

void MODULE_SOURCE_API( mod_print, print_name )( const char* name );

=(expand MODULE_SOURCE_API)=>

void mod_print_print_name( const char *);

Как видите, объявленная функция (и определенная в конце кода) - это не print_name, а mod_print_print_name. Вернитесь к исходному коду и посмотрите, как предполагается использовать макрос. Я предполагаю, что вызовы функций выполняются с теми же макросами, которые используются для объявлений и определений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...