在main()

时间:2017-03-31 22:37:16

标签: 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 << "Hello, world!" << std::endl;
}

......我不需要g_foo而宁愿它不存在。有没有办法在没有中间临时变量的情况下调用void函数?

3 个答案:

答案 0 :(得分:1)

  

我想知道是否可以在不使用临时变量的情况下调用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;
}

答案 1 :(得分:0)

this question的回答引起了__attribute__((constructor))的注意,但是,由于我不完全理解的原因,如果使用了void函数,我在使用SIGSEGV时会看到std::cout printfSIGSEGV未导致#include <cstdio> #include <cstdlib> void preinit(int argc, char * * argv, char * * envp) { printf("%s\n", __FUNCTION__); } void init(int argc, char * * argv, char * * envp) { printf("%s\n", __FUNCTION__); } void fini() { printf("%s\n", __FUNCTION__); } __attribute__((section(".init_array"))) typeof (init) * __init = init; __attribute__((section(".preinit_array"))) typeof (preinit) * __preinit = preinit; __attribute__((section(".fini_array"))) typeof (fini) * __fini = fini; void __attribute__((constructor)) constructor() { printf("%s\n", __FUNCTION__); } void __attribute__((destructor)) destructor() { printf("%s\n", __FUNCTION__); } void my_atexit() { printf("%s\n", __FUNCTION__); } void my_atexit2() { printf("%s\n", __FUNCTION__); } int main() { atexit(my_atexit); atexit(my_atexit2); } )。

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

http://dbp-consulting.com/tutorials/debugging/linuxProgramStartup.html

解决方案的摘录(稍微修改以通过编译)在这里:

import static reactor.bus.selector.Selectors.$;

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

答案 2 :(得分:0)

检查您的编译器是否支持#pragma startup(或等效的),例如:

#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;
}