是否有可能在c中重新定义主函数

时间:2014-03-04 11:19:48

标签: c gcc main

我在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

所以我想知道为什么它不起作用?当我对mallocfree函数使用相同的技术时,它可以完美运行。那有什么不对?

为什么我想做这样的事情?我想在执行main函数之前做一些代码。有可能这样吗?如果没有,还有其他方法吗?

P.S。:抱歉,我没有提及有问题。我在Ubuntu OS中使用gcc。 如果您正在投票,请在评论中说明理由。您的评论对我的进一步发展非常有用。

3 个答案:

答案 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的值越低,函数执行的越早。