使用#defines并将函数传递给它们

时间:2010-01-25 08:57:57

标签: c

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 个答案:

答案 0 :(得分:3)

您可以尝试手动展开宏以了解正在发生的事情:

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。返回初始代码,看看如何使用宏。我假设函数调用是使用与声明和定义相同的宏执行的。

答案 1 :(得分:3)

#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);

}