我在c中使用宏看到了重新定义函数here。所以我很有意思是可以重新定义主要功能吗?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char **argv)
{
printf("Original main function\n");
return 0;
}
int _main(int argc, char **argv)
{
printf("New Original main function\n");
return main(argc, argv);
}
#ifdef DEBUG
#define main(argc, argv) _main(argc, argv)
#endif
代码编译没有任何问题,但我得到:
Original main function
所以我想知道为什么它不起作用?当我对malloc
和free
函数使用相同的技术时,它可以完美运行。那有什么不对?
为什么我想做这样的事情?我想在执行main
函数之前做一些代码。有可能这样吗?如果没有,还有其他方法吗?
P.S。:抱歉,我没有提及有问题。我在Ubuntu OS中使用gcc。 如果您正在投票,请在评论中说明理由。您的评论对我的进一步发展非常有用。
答案 0 :(得分:1)
你的#define根本不会改变主函数 - 它是一个宏预处理器。
#define的唯一影响是将对_main中的main的调用更改为对_main()的递归调用。但是由于没有调用_main,这就是死代码。这是预处理器运行后代码的样子......
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char **argv)
{
printf("Original main function\n");
return 0;
}
int _main(int argc, char **argv)
{
printf("New Original main function\n");
return _main(argc, argv); /* recursive call due to macro replace */
}
这导致了下一个问题 - 这就是重新定义主要原因的原因?如果你想在调试时运行一些完全不同的代码,只需将main声明为
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char **argv)
{
#ifdef DEBUG
return debugApp( argc, argv);
#else
return productionApp( argc, argv);
#endif
}
N.B 仅仅因为你可以做某事并不意味着你应该这样做。 : - )
答案 1 :(得分:1)
如果要更改程序的入口点,则无需使用定义。您可以使用链接器的-e
选项:
gcc -Wl,-e,__main ...
请注意额外的下划线。根据某些选项,符号名称可能不同。
答案 2 :(得分:1)
如果您的问题确实存在:“我可以在主要之前执行代码吗?”然后答案强调是。
由于您使用的是GCC,因此可以使用函数属性(http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html)将函数标记为构造函数。
void pre_main_function (void) __attribute__ ((constructor));
可以在http://www.geeksforgeeks.org/functions-that-are-executed-before-and-after-main-in-c/
找到一个有用的示例修改强>
也可以使用以下语法:
__attribute__ (( constructor(n) ))
其中n
指定优先级,允许您在main之前标记要执行的多个函数,同时让您控制执行顺序(n的值越低,函数执行的越早。