头文件中调用static函数

Kyle__Shaw 2015-09-29 08:44:37
最近遇到一个奇怪的问题,代码如下:


//test.h
#ifndef TEST_H
#define TEST_H

#include <iostream>
#include <string>

class Test
{
public:
std::string STR1;
std::string STR2;

static int static_init() {
std::cout << "static_init" << std::endl;
return 0;
}

void set_str();
void display();
};



//test.cpp
#include "test.h"

using namespace std;

void Test::set_str() {
STR1 = "STR1 static init";
STR2 = "STR2 static init";
}

void Test::display() {
cout << "STR1" << STR1 << endl;
cout << "STR2" << STR2 << endl;
}

static int result = Test::static_init();
#endif // TEST_H
// vim: set ts=4 sw=4 sts=4 et:



// main.cpp
#include <iostream>
#include "test.h"

using namespace std;
int main()
{
cout << "Start" << endl;
Test t1;
}


就是上面三个文件。看似很简单的代码,但是运行的时候却有很奇怪的问题出现。
运行结果是

static_init
static_init
Start

为什么会执行了两次static_init的呢?
跟编译器的优化有关系?我用的是gcc 4..7.1。
问了一下其他人,也不知道什么原因。唯有来论坛求教各位大牛了。
...全文
258 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Kyle__Shaw 2015-09-30
  • 打赏
  • 举报
回复
引用 4 楼 ipqtjmqj的回复:
[quote=引用 3 楼 roddick621 的回复:] 嗯,贴的时候搞乱了。。。 现在没权限修改过来了。。。 难道是gcc的问题?
我估计你把test.cpp中的内容也放到test.h里吧,所以会搞乱。 这样就有两个static int result; 由于是static的, 一个在 test.o中,另一个在 main.o中,所以不会冲突。 切记头文件中只能写类型的定义,宏的定义,变量的声明,不能有变量的定义[/quote] 我知道基本上都不会在头文件里面做定义。我看到ACE里面有一个头文件里面这么做了,但是在x86上面能正常调用,在parisc上不能用,所以模仿它的方法写了这个
Kyle__Shaw 2015-09-30
  • 打赏
  • 举报
回复
引用 4 楼 ipqtjmqj的回复:
[quote=引用 3 楼 roddick621 的回复:] 嗯,贴的时候搞乱了。。。 现在没权限修改过来了。。。 难道是gcc的问题?
我估计你把test.cpp中的内容也放到test.h里吧,所以会搞乱。 这样就有两个static int result; 由于是static的, 一个在 test.o中,另一个在 main.o中,所以不会冲突。 切记头文件中只能写类型的定义,宏的定义,变量的声明,不能有变量的定义[/quote] 这个倒没有,我是分开3个文件的。 只是贴上来csdn的时候才搞乱了格式
ipqtjmqj 2015-09-30
  • 打赏
  • 举报
回复
引用 5 楼 roddick621 的回复:
[quote=引用 4 楼 ipqtjmqj的回复:][quote=引用 3 楼 roddick621 的回复:] 嗯,贴的时候搞乱了。。。 现在没权限修改过来了。。。 难道是gcc的问题?
我估计你把test.cpp中的内容也放到test.h里吧,所以会搞乱。 这样就有两个static int result; 由于是static的, 一个在 test.o中,另一个在 main.o中,所以不会冲突。 切记头文件中只能写类型的定义,宏的定义,变量的声明,不能有变量的定义[/quote] 这个倒没有,我是分开3个文件的。 只是贴上来csdn的时候才搞乱了格式[/quote] 你 说贴出来乱了, 那你把三个文件重新贴一遍吧
ipqtjmqj 2015-09-29
  • 打赏
  • 举报
回复
引用 3 楼 roddick621 的回复:
嗯,贴的时候搞乱了。。。 现在没权限修改过来了。。。 难道是gcc的问题?
我估计你把test.cpp中的内容也放到test.h里吧,所以会搞乱。 这样就有两个static int result; 由于是static的, 一个在 test.o中,另一个在 main.o中,所以不会冲突。 切记头文件中只能写类型的定义,宏的定义,变量的声明,不能有变量的定义
Kyle__Shaw 2015-09-29
  • 打赏
  • 举报
回复
嗯,贴的时候搞乱了。。。 现在没权限修改过来了。。。 难道是gcc的问题?
iyomumx 2015-09-29
  • 打赏
  • 举报
回复
编译器问题吧,不应该执行两次的 另外你贴的 #endif // TEST_H 跑到cpp里了
Kyle__Shaw 2015-09-29
  • 打赏
  • 举报
回复
写了一个超级简陋的Makefile方便各位编译

all: main

test.o: test.cpp test.h
        g++ -c test.cpp -o test.o

main.o: main.cpp
        g++ -c main.cpp -o main.o

main: test.o main.o
        g++ test.o main.o -o main

clean:
        rm -f ./*.o main

.PHONY: main

64,684

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧