在一个C+中定义会不会很奇怪+;功能? 我的C++函数需要计算一个简单的超时值。 CalcTimeout(const mystruct st) { return (st.x + 100) * st.y + 200; }

在一个C+中定义会不会很奇怪+;功能? 我的C++函数需要计算一个简单的超时值。 CalcTimeout(const mystruct st) { return (st.x + 100) * st.y + 200; },c++,coding-style,c-preprocessor,C++,Coding Style,C Preprocessor,数字100和200在以后阅读代码时会比较混乱,所以我想使用#define。但是这些定义只需要用于这个函数,我可以在函数内部定义它们吗?这样做的好处是: 这是非常当地的价值观,没有人需要知道它 更接近使用它的地方,意图很清楚,它没有其他用途,它们就像局部变量(除了它们不是) 缺点可能是定义局部变量/常量之类的东西相当粗糙,但它显然不是局部的 除了这一点外,在C++函数中定义是不是很奇怪?大多数情况下,我们在文件顶部使用#defines。用常量变量替换固定的本地硬编码值是否更好 其目的实际上是使

数字100和200在以后阅读代码时会比较混乱,所以我想使用#define。但是这些定义只需要用于这个函数,我可以在函数内部定义它们吗?这样做的好处是:

  • 这是非常当地的价值观,没有人需要知道它
  • 更接近使用它的地方,意图很清楚,它没有其他用途,它们就像局部变量(除了它们不是)
缺点可能是定义局部变量/常量之类的东西相当粗糙,但它显然不是局部的

除了这一点外,在C++函数中定义是不是很奇怪?大多数情况下,我们在文件顶部使用#defines。用常量变量替换固定的本地硬编码值是否更好


其目的实际上是使代码更可读/更易懂。

不要使用宏来定义常量;使用常量

const int thingy = 100;  // Obviously, you'll choose a better name
const int doodad = 200;

return (st.x + thingy) * st.y + doodad;
与扩展为常量表达式的宏一样,这些宏可以被视为编译时常量。与宏不同,这些宏在函数中的作用域是正确的


如果您确实有理由定义一个仅在本地使用的宏,那么您可以使用
#unde
在定义完成后将其删除。但是一般来说,当(这里)有一个语言级别的构造,你应该避免宏。在C++中,

< P> >,特别地,看到宏用于这个目的会很奇怪。在C++ >代码> const 中完全取代宏来定义清单常数。而且
const
工作得更好。(在C语言中,在许多(或大多数)情况下,您必须坚持使用
#define
,但您的问题被标记为C++)


已经说过,伪局部宏有时在C++中很方便(特别是在语言的C++ 11版本中)。如果出于某种原因,您必须在函数的“内部”定义这样一个宏,那么最好在同一范围的末尾为该宏创建一个显式的

#undef
。(由于预处理器并不真正关心作用域,也无法区分“内部”和“外部”,因此我将“内部”一词括在引号中。)这样,您就可以模拟其他本地标识符具有的作用域可见性行为,而不是“本地”定义的宏将溢出到代码的其余部分,一直到翻译单元的末尾。

非常奇怪。“没有其他人知道”也不完全正确,预处理器没有范围的概念。你最好在函数体之前定义它,然后在代码之后定义代码> unDEF< /Cudio> ING。或者只使用更好的替代方法,因为C++和C:const变量。你可以做到,并且当你完成它们时,你可以<代码>但迈克·西摩的答案是一个更好的解决方案。我不确定是否有理由投反对票。其基本原理是什么?这两个常量仅在单个函数中有意义吗?此外,任何优秀的编译器都会将它们优化到与文本常量相同的程度;它们不会占用任何额外的空间或时间。此外,你还可以进行类型检查。因此,对于<>代码> const >对象> C++ >定义了宏和没有更多的成本。我正在使用C++ C++,但我的假设是在两种情况下都是相同的。“代码> > const <代码>对象的处理和代码< > const 对象的语义在C和C++之间有很大的不同。事实上,C和C++是从一开始就存在的一个主要区别。这种差异正是C中必须使用<代码>定义> <代码>(或<代码> EnUM <代码> >来定义命名常量的原因,而C++中,可以使用基于<代码> const 限定符(或者,再次,<代码> EnUM<代码>)的更好的特性。