C++ 在main()之前调用void函数

C++ 在main()之前调用void函数,c++,static-initialization,C++,Static Initialization,我想知道是否可以在不使用临时变量的情况下调用void函数。例如,在以下代码块中 #include <iostream> void earlyInit() { std::cout << "The void before the world." << std::endl; } int g_foo = (earlyInit(), 0); int main( int argc, char* argv[] ) { std::cout << "H

我想知道是否可以在不使用临时变量的情况下调用void函数。例如,在以下代码块中

#include <iostream>

void earlyInit()
{
  std::cout << "The void before the world." << std::endl;
}

int g_foo = (earlyInit(), 0);

int main( int argc, char* argv[] )
{
  std::cout << "Hello, world!" << std::endl;
}
#包括
void earlyInit()
{
std::cout一个答案引起了我的注意,但是,由于我不完全理解的原因,如果使用的void函数
std::cout
printf
没有引起
SIGSEGV
),我在使用时观察到一个
SIGSEGV

我早些时候发布了这个问题的一个版本(但愚蠢地删除了它)。当时的一位回答者向我指出了这篇讨论情况和解决方案的优秀文章:

该解决方案的摘录(稍作修改以通过编译)如下:

#包括
#包括
void preinit(int argc、char**argv、char**envp){
printf(“%s\n”,函数);
}
void init(int argc,char**argv,char**envp){
printf(“%s\n”,函数);
}
void fini(){
printf(“%s\n”,函数);
}
__属性(节(“.init\u数组”))类型的(init)*\uu init=init;
__属性(节(“.preinit\u数组”))typeof(preinit)*\uu preinit=preinit;
__(fini)*\uu fini=fini的属性(节(“.fini\u数组”))类型;
void uuu属性uuu((构造函数))构造函数(){
printf(“%s\n”,函数);
}
void uuu属性uuu((析构函数))析构函数(){
printf(“%s\n”,函数);
}
取消我的退出(){
printf(“%s\n”,函数);
}
作废我的_atexit2(){
printf(“%s\n”,函数);
}
int main(){
atexit(我的atexit);
atexit(my_atexit 2);
}

(向原回答者道歉,我删除了我原来的帖子,无法给予应有的信任。)

检查您的编译器是否支持
#pragma启动
(或同等版本),例如:

#包括
void earlyInit()
{
标准::cout
我想知道是否可以在不使用临时变量的情况下调用void函数。例如,在下面的代码块中

该语言没有提供任何这样的机制。正如其他答案所指出的,可能有编译器特定的方法来实现这一点

然而,我不认为你的方法有任何错误。我经常使用以下模式

#include <iostream>

namespace mainNS  // A file-specific namespace.
{
   void earlyInit()
   {
      std::cout << "The void before the world." << std::endl;
   }

   struct Initializer
   {
      Initializer();
   };
}

using namespace mainNS;
static Initializer initializer;

Initializer::Initializer()
{
   earlyInit();
   // Call any other functions that makes sense for your application.
}

int main( int argc, char* argv[] )
{
  std::cout << "Hello, world!" << std::endl;
}
#包括
名称空间mainNS//文件特定的名称空间。
{
void earlyInit()
{

std::你就不能问这个问题并删除它。为什么?你考虑过一种类似于懒惰加载的Meyers Singleton的方法吗?@NeilButterworth,因为我很愚蠢。对不起。我真的很懊悔。@user4581301我想你指出的设计模式仍然需要一个Singleton对象的静态初始化,不是吗?如果不是,请我的问题的关键是是否可以在没有临时变量的情况下调用
main()
之前的函数。“我的问题的关键是是否可以在没有临时变量的情况下调用main()之前的函数”-答案是,可移植?否。更新了代码摘录以通过gcc-4.9.1编译。
std::cout
是专门初始化的。可能出于某种原因,此属性在静态初始化完成之前运行函数。看起来很有希望,但我的编译器似乎不支持此功能。代码厨师也不支持哪个编译器这是一个扩展吗?@StoneThrow:您实际使用的是哪种编译器?不同的编译器支持不同的东西。bcc支持
#pragma startup
,VC++支持
#pragma init_seg
,gcc和clang支持
(构造函数)
。这就是为什么我在回答中说“(或等效的)。.g++(gcc)4.8.3 20140911(红帽4.8.3-7)。别取笑我!我知道它很旧,但我无法控制。
#include <iostream>

void earlyInit()
{
  std::cout << "The void before the world." << std::endl;
}
#pragma startup earlyInit

int main( int argc, char* argv[] )
{
  std::cout << "Hello, world!" << std::endl;
}
#include <iostream>

namespace mainNS  // A file-specific namespace.
{
   void earlyInit()
   {
      std::cout << "The void before the world." << std::endl;
   }

   struct Initializer
   {
      Initializer();
   };
}

using namespace mainNS;
static Initializer initializer;

Initializer::Initializer()
{
   earlyInit();
   // Call any other functions that makes sense for your application.
}

int main( int argc, char* argv[] )
{
  std::cout << "Hello, world!" << std::endl;
}