如果确保inline一定不会被展开?

Meuck 2008-01-08 04:38:23
是这样的,我想在头文件中定义一个全局变量.
最终我发现这样做可以达到我的要求:

inline int *GetValue()
{
static int g_value = 0;
return &g_value;
}

目前是没有什么问题,但是如果这段代码一量展开的话.
那么我的结果就不正确了.而如果不加inline关键字的话.我就不能够在头文件中定义函数体了.

在这里面如何写代码可以确保这段函数一定不会被展开呢?
...全文
685 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
独孤过儿 2008-01-11
  • 打赏
  • 举报
回复
设计本身有问题,却想通过技术的手段来弥补,这无异于饮鸩止渴...即使当时能勉强通过,日后也必然前功尽弃。
kou_ryou 2008-01-11
  • 打赏
  • 举报
回复
28楼说的不错
zh1369 2008-01-11
  • 打赏
  • 举报
回复
在这里面如何写代码可以确保这段函数一定不会被展开呢?
----
是否展开由编辑器决定吧。一般来说复杂的代码通常不展开。
但是我觉得 内联函数是否展开都不会影响程序的执行结果的。
微笑的撒旦 2008-01-11
  • 打赏
  • 举报
回复
非常糟糕的设计。

记住,声明归声明,定义归定义。

在cpp里面还可以混在一起,但是在头文件中一定不要那么做。
agaric 2008-01-10
  • 打赏
  • 举报
回复
## 既然不想被展开,那就不要用内联。
Meuck 2008-01-10
  • 打赏
  • 举报
回复
刚试出有点问题,好象VC6并不支持noinline关键字哦.
Meuck 2008-01-10
  • 打赏
  • 举报
回复
楼上的方法不错,我先试试看.
Meuck 2008-01-10
  • 打赏
  • 举报
回复
i got it!

关键字 __declspec(selectany) 可以解决我的问题.....
这个是在atlbase.h中大量使用的一个关键字!呵呵,至于函数,atlbase.h中也是以inline来解决重复定义错误的.
呵呵......

把上面代码写成
__declspec(selectany) int g_value = 0;
就没有问题了.
Oversense 2008-01-10
  • 打赏
  • 举报
回复
就算展开,
static变量还是一个
这是c++规范规定的...
flyingwow99 2008-01-09
  • 打赏
  • 举报
回复
LZ一定要问inline的问题
那么LZ可知道inline只是一个请求操作,具体展开与否依赖于编译器和你的代码
哈哈 只要你的代码加入一些 switch 之类的,编译器就没办法展开它了
BluntBlade 2008-01-09
  • 打赏
  • 举报
回复
某些代码需要在源码级共享,假如做成CPP。那么就要在每个工程里都添加一份!

---------------------------------------

做成类库不就完了……
Meuck 2008-01-09
  • 打赏
  • 举报
回复
to taodm:
某些代码需要在源码级共享,假如做成CPP。那么就要在每个工程里都添加一份!
不定义变量也行,只要能够定义函数可以,就像原问题那样.
to Oversense:
我没有试到成功展开过,不过我没试到就不等于不会展开对不?

考虑在两个函数中调用GetValue.那么里面的static 变量就不是一个而是两个了!
Oversense 2008-01-09
  • 打赏
  • 举报
回复 1
楼主,你确定

"展开之后,你的结果不对?"

你是空想的吧,还是实践过?

taodm 2008-01-09
  • 打赏
  • 举报
回复
说你的原始需求!
你为什么要在.h里定义变量?这是应该绝对禁止的行为。
zenny_chen 2008-01-09
  • 打赏
  • 举报
回复
我现在才看明白怎么回事。

楼主啊,你这样做真是无语啊。如果它不被展开的话,它实际上仍然是一个普通的external函数。这样,最好的方法仍然是将g_value定义在一个源文件中,
而在头文件中则可以安然地使用内联,以提高效率。当然,g_value要在头文件中做一下extern的声明。

如果你这样的代码被展开的话,如果多个源文件都包含你这个头文件,那么都会各自生成一个g_value实体,因此这样一来,g_value在全局变量区域内就有多个副本。

如果你模板函数的话倒也可以解决这个问题:
下面以Visual C++8.0环境为例:

// test.h

#ifndef TEST_H
#define TEST_H

template <typename T>
__declspec(noinline) T *GetValue_(void)
{
static T g_value = (T)0;

return &g_value;
}

template __declspec(noinline) int* GetValue_(void);


#define GetValue() GetValue_<int>()


#endif




// output.cpp


#include "test.h"


void Output()
{
*GetValue() = 1;
}




// test.cpp

#include <iostream>
using namespace std;

#include "test.h"

extern void Output(void);


void main(void)
{
Output();

cout << "The value now is: " << *GetValue() << endl;
}


zenny_chen 2008-01-09
  • 打赏
  • 举报
回复
如果是一定不内联的话,这个简单:
在Visual DSP++4.5版本或以上版本中:


#pragma never_inline
void Test(void)
{
cout << "Hello, world" << endl;
}



在Visual C++7.0或以上版本中:

__declspec(noinline) void Test(void)
{
cout << "Hello, world" << endl;
}
taodm 2008-01-09
  • 打赏
  • 举报
回复
include 一个头文件和project里加一个源文件,都是举手之劳
建议你不要在这个上面玩技巧。
张琪Samuel 2008-01-09
  • 打赏
  • 举报
回复
可以用VC++特殊的修饰词__forceinline。
tjltail 2008-01-09
  • 打赏
  • 举报
回复
inline只是告诉编译器适当的时候可以内联
像这样的全局函数,建议用c++的命名空间
.h
namespace XXX
{
函数声明
}

.cpp
#include<XX.h>
函数的实现
yuanchuang 2008-01-09
  • 打赏
  • 举报
回复
Meuck
如果你相信什么,你就应当有所了解
等 级:
发表于:2008-01-08 22:45:3615楼 得分:0
to sunote:
object::static int g_value; 需要在CPP中定义.

to zenny_chen:
不是如何一定内联,而是如何一定不内联.

///////////////////////
inline只是为了能在头文件中写函数能够编译通过的手段而已.
其实我并不是想要inline的真正功能....
============
楼主唯独没有回复我!BS之!
加载更多回复(17)

65,210

社区成员

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

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