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");
但是我如何打印出连接的结果呢?这样做的原因是什么?
非常感谢,
答案 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);
}