我想知道是否可以使用临时变量调用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函数?
答案 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
printf
(SIGSEGV
未导致#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;
}