作者reader (读者)
看板CSSE
标题Re: [讨论] 另一种 C++ 巨集
时间Thu Feb 24 00:04:18 2005
※ 引述《reader (读者)》之铭言:
:
: 一般必须在执行时期处理的状况,主要是因为有递回问题和设值问题,
: 例如:
:
: int f(int i) = { if(i < 2) return 1; return f(i-1) + f(i-2); }
:
: void g(int x) {
:
: f = f(x);
:
: }
:
: 像这样子就不能在编译时期完成了。但是这并不是主要应用,就 C++ 的
: 原始想法而言(我搞不懂现在 C++ 标准委员会的想法),可以避免动态
: 机制的话就尽量避免,而现在看起来是做得到的。
:
:
: --
: 推 jeunder:恕我愚钝, 体会不出你的例子有 "必须在执行时期 61.230.218.28 02/23
: → jeunder:处理" 的必要性耶... Q_Q 61.230.218.28 02/23
: 推 jeunder:感觉上只是 compile time 的文字代换而已 61.230.218.28 02/23
喔? f(x) 的参数是执行时期才得到的呢,这样如何能够在编译时期决定呢?
这是费波那契数,f(3) 就要代换 3 次, f(4) 则需要 5 次, f(5) 是 8 次,
当 f(x) 的参数是变数时,应该是不能预先决定代换的次数才对。
另外,如果可以重覆设定,也就等於是变数了,例如在非常数的判断式中使用,
这样应该也不能在编译时期决定吧。
所以必须强制不能使用递回和设值,才能在编译时期决定。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.222.173.26
1F:推 jeunder:ok, 应该是例子的问题, 因为在此例中, 我认为f() 61.230.218.28 02/24
2F:→ jeunder:是个函数, 只需存在一个实体就够了... 61.230.218.28 02/24
3F:→ jeunder:然而, 如何在 runtime 产生实体呢? 在 runtime 61.230.218.28 02/24
4F:→ jeunder:会动态增减的 code? 感觉上有一个直译器, 最後还 61.230.218.28 02/24
5F:→ jeunder:不是以呼叫函数的方式来呼叫 f() 61.230.218.28 02/24