错误、漏洞、问题 - 页 2025

 

执行中的双重错误

#define  XY( X, Y )      X##Y
#define  f( X )  XY( g, X )
#define  MACRO1( X )     #X
#define  MACRO2( X )     MACRO1( X )
#define  SIZE    5
void OnStart()
{
    printf( "%s", MACRO2( f( SIZE )));
}

结果:f(SIZE)。

应该是:G5

 
leonerd:

如何从测试可视化图中删除箭头?我开始测试,仍然有来自上次测试的输入的箭头和线条。

清理tester.tpl模板,对象可能在那里。

 
A100:

执行中的双重错误

结果:f(SIZE)。

它应该是:G5


在我看来,这似乎是一个合乎逻辑的结果。

 
fxsaber:
在我看来,这似乎是一个合乎逻辑的结果。

预期:首先替换内部宏SIZE,然后替换中间宏f( X ),最后替换外部宏MACRO2( X )。

但即使你使用不完整的逻辑,结果也是不同的。

#define  MACRO1( X )     #X
void OnStart()
{
    printf( "%s", MACRO1( f( SIZE )));
}
//Результат  :f(SIZE)
//должен быть:f( SIZE )

至少在空间上有区别

 
A100:

预期:首先替换内部宏SIZE,然后替换中间宏f( X ),最后替换外部宏MACRO2( X )。

但即使你使用不完整的逻辑,结果也是不同的。

至少差别在空白处

当然,功能的优先次序是由内到外。另一方面,对于宏来说,情况恰恰相反。

#X 是一个没有空格的字符串。当然,人们可以不同意这一点。

 
fxsaber:

当然,功能的优先次序是由内而外。另一方面,Macros的情况则相反。

#X 是一个没有空格的字符串。当然,你可以不同意这一点。

但是,既然已经有了简单的旧规则,有了这样的记号--为广大群众所熟知,并建立了几十年,我们为什么还要用旧的记号发明新的复杂规则呢?如果规则是新的,那么指定也应该是新的。

 
A100:

执行中的双重错误

结果:f(SIZE)。

应该是:G5

我在一年前向服务台发出了类似的请求(#1600034,现在仍然没有回应。似乎他们并不关心所有这些 "怪胎 "的错误。而一般来说,从所有人的判断来看,语言并不打算改进。只有主要的错误被修复,没有更多的错误。
 
A100:

既然已经有了简单的旧规则,有了这样的称呼,为什么还要发明新的、复杂的规则,而且是几十年来建立起来的,为广大群众所熟知的?如果规则是新的,指定也应该是新的。

我们到底在谈论什么?应该是怎样的?

 
fxsaber:

我们到底在谈论什么?那么应该如何呢?

#X 是字符串的原样--即带有空格(如果有的话)。而见上面 f( SIZE )->g5的例子。我没有自己发明这些规则--C++编译器就是这样做的

 
Alexey Navoykov:
一年前我向服务台发出了类似的请求(#1600034,仍然没有答复。似乎他们并不关心所有这些 "怪胎 "的错误。而一般来说,从所有人的判断来看,语言并不打算改进。他们只修复主要的错误,没有别的。

我昨天无意中看到了这个,并惊讶地发现,结合

template<typename T, int n>

几十行的代码简直变成了一两行(!)。这就是我写这篇文章的原因--乍一看,这可能是一件小事。我再次确信,C++中没有任何废话