Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在c/c+中开始执行程序+;来自不同的函数,但不是main()_C++_C_Function_Main - Fatal编程技术网

C++ 如何在c/c+中开始执行程序+;来自不同的函数,但不是main()

C++ 如何在c/c+中开始执行程序+;来自不同的函数,但不是main(),c++,c,function,main,C++,C,Function,Main,可能重复: 我想开始执行包含2个函数(不包括main)的程序 我想从check()开始执行,是否可以在c/c++中执行?您可以使用一个简单的包装器来执行: int main() { check(); } 由于标准明确指定main作为程序入口点,因此不能以任何其他方式进行移植 编辑以供评论:永远不要这样做。在C++中,在静态初始化时,可以滥用静态初始化,使其具有检查> /代码>之前的代码>主< /代码>,但是您仍然不能从检查< /代码>中调用主 >。您可以先运行检查。如注释中所述,这在

可能重复:

我想开始执行包含2个函数(不包括main)的程序


我想从check()开始执行,是否可以在c/c++中执行?

您可以使用一个简单的包装器来执行:

int main()
{
    check();
}
由于标准明确指定
main
作为程序入口点,因此不能以任何其他方式进行移植

编辑以供评论:永远不要这样做。在C++中,在静态初始化时,可以滥用静态初始化,使其具有<代码>检查> /代码>之前的代码>主< /代码>,但是您仍然不能从<代码>检查< /代码>中调用<代码>主<代码> >。您可以先运行
检查
。如注释中所述,这在C中不起作用,因为它需要常量初始值设定项

// At file scope.
bool abuse_the_language = (check(), true);

int main()
{
    // No op if desired.
}

main
调用
check
似乎是最合理的解决方案,但您仍然可以探索使用
/ENTRY
为应用程序定义另一个入口点。有关更多信息,请参阅。

除了main之外,您不能启动其他程序,尽管有一些方法可以让某些代码在main之前执行

将代码放入静态初始化块将使代码在main之前运行;然而,它不是100%可控的。虽然可以保证它在main之前运行,但不能指定两个静态初始化块在它们都在main之前执行之前运行的顺序

链接器和加载程序都有主的概念作为C/C++程序的共享“理解”开始;但是,有些代码在

main
之前运行。此代码负责程序的“设置环境”(如设置
stdin
cin
)。通过将代码放在静态初始化块中,您可以有效地说,“嘿,您也需要这样做才能拥有正确的环境”。一般来说,这应该是一些小的东西,可以独立于其他项目的执行顺序

如果您需要在main之前按顺序执行两到三件事情,那么将它们转换为适当的函数,并在main的开头调用它们。

您可以在main启动之前通过创建一个对象来“拦截”对main的调用。构造函数需要执行您的函数

#include <iostream>

void foo()
{
  // do stuff

  std::cout<<"exiting from foo" <<std::endl;
}

struct A
{
  A(){ foo(); };
};

static A a;

int main()
{
  // something
  std::cout<<"starting main()" <<std::endl;
}
#包括
void foo()
{
//做事

std::cout各种链接器都有各种选项来指定入口点。例如,Microsoft链接器使用:

/ENTRY选项指定入口点函数作为起始点 .exe文件或DLL的地址

GNU的ld


也就是说,修改入口点是一项非常高级的功能,您必须完全了解它的工作原理。首先,它可能会导致跳过加载标准库的初始化过程。

有一种人为的方法来实现这一点,但它只不过是一种黑客行为

其思想是创建一个包含main函数的静态库,并使其调用“check”函数。 链接器将在与“程序”链接时解析符号,而“程序”代码本身确实没有main


除非您有非常特殊的需求,否则不建议这样做(我想到的一个例子是Windows Screensavers,因为Windows SDK附带的帮助程序库具有执行特定初始化(如解析命令行)的主功能)。 我们可以简单地使用

#pragma startup function-name <priority>
#pragma exit function-name <priority>
可选优先级参数应为64到255之间的整数。最高优先级为0。具有较高优先级的函数在启动时首先调用,最后在退出时调用。如果未指定优先级,则默认为100。
谢谢!

我不必先打电话给main()。我得先打电话给check,然后再打电话给main。有什么想法吗?你真是太丢脸了,因为你为此获得了更多的选票(不过还是+1)。我不认为这是合法的C。具有静态生存期的对象的初始值设定项应该是常量。我所有的编译器都拒绝使用此代码。这个问题被问了很多,请回答您的问题。您可以编写自己的引导代码来调用
check()
,而不是
main()
。或者您可以编写
main()
因此它调用
check()
。后者更容易实现几个数量级。C标准规定(ISO/IEC 9899:2011§5.12.2.1程序启动)程序启动时调用的函数名为
main
。答案取决于您使用的编译器。您的操作系统和编译器是什么?您可以创建一个独立的程序,所有赌注都是无效的。顺便说一下,
返回0;
是隐含的……在我看来,返回值的函数应该有
return value;
结尾的语句。我更喜欢如图所示编写的代码。我想很多人都同意Jonathan 8^)这里的风险是其他应该初始化的对象没有被初始化。-1:除非你熟记静态初始化的规则…但即使在这种情况下,我也不会限制任何由于静态初始化而启动的事件应用程序。这是完全不受控制的流程。我已经找到了解决我自己问题的方法。我们可以简单地使用。请记住,您的代码不是那样可移植的。例如,GCC不支持
#pragma startup
,并将抛出一个警告,我在上面提到过,我正在使用turbo c/c++.谢谢。
#include <iostream>

void foo()
{
  // do stuff

  std::cout<<"exiting from foo" <<std::endl;
}

struct A
{
  A(){ foo(); };
};

static A a;

int main()
{
  // something
  std::cout<<"starting main()" <<std::endl;
}
#pragma startup function-name <priority>
#pragma exit function-name <priority>
void func(void);