【发布时间】:2020-07-02 18:26:03
【问题描述】:
我有
#define ARG(TEXT , REPLACEMENT) replace(#TEXT, REPLACEMENT)
所以
QString str= QString("%ONE, %TWO").ARG(%ONE, "1").ARG(%TWO, "2");
变成
str= QString("%ONE, %TWO").replace("%ONE", "1").replace("%TWO", "2");
//str = "1, 2"
问题在于 VS2019 在格式化代码时 (Edit.FormatSelection) 将 % 符号解释为运算符并添加空格
QString str= QString("%ONE, %TWO").ARG(% ONE, "1").ARG(% TWO, "2");
(我认为这是 VS 中的错误)。代码编译时没有警告。
当我正在处理一些具有此“功能”传播的古老代码时,我担心会自动格式化包含此“功能”的文本并破坏功能。
有没有办法在编译时检测到带有空格的宏的此类参数?
【问题讨论】:
-
我对你的宏的第一个想法是“为什么用户必须引用第二个参数而不是第一个”?如果你通过让用户写
.ARG("%ONE", "1")来解决这个问题,问题就会消失(并且宏会更加一致)。不是您问题的答案,而是一种可能的替代方法... -
似乎格式化程序看到一个运算符(
%)后跟一个标识符(ONE),因此它正在添加空间。从上下文来看,它并没有太多考虑。 -
尽管第一次出现,但似乎这个问题是关于 VS IDE 的一个特性,与编译或语言无关?
-
是的,我认为您不能说这是格式化程序中的错误。它怎么知道
%ONE不是表达式的一部分?我大多同意让用户自动写.ARG("%ONE", "1") or to add the%` 以便用户写.ARG(ONE, "1")会更干净。但由于这可能是遗留代码,我猜你所拥有的就是你所拥有的。我添加了一个非常老套的答案。
标签: c++ c-preprocessor visual-studio-2019