• <legend id='1vX9z'><style id='1vX9z'><dir id='1vX9z'><q id='1vX9z'></q></dir></style></legend>

        <tfoot id='1vX9z'></tfoot>
      1. <i id='1vX9z'><tr id='1vX9z'><dt id='1vX9z'><q id='1vX9z'><span id='1vX9z'><b id='1vX9z'><form id='1vX9z'><ins id='1vX9z'></ins><ul id='1vX9z'></ul><sub id='1vX9z'></sub></form><legend id='1vX9z'></legend><bdo id='1vX9z'><pre id='1vX9z'><center id='1vX9z'></center></pre></bdo></b><th id='1vX9z'></th></span></q></dt></tr></i><div id='1vX9z'><tfoot id='1vX9z'></tfoot><dl id='1vX9z'><fieldset id='1vX9z'></fieldset></dl></div>
          <bdo id='1vX9z'></bdo><ul id='1vX9z'></ul>

        <small id='1vX9z'></small><noframes id='1vX9z'>

      2. 我的代码如何区分编译时常量和变量?

        时间:2023-07-02

            <bdo id='9ERZ7'></bdo><ul id='9ERZ7'></ul>

            • <legend id='9ERZ7'><style id='9ERZ7'><dir id='9ERZ7'><q id='9ERZ7'></q></dir></style></legend>

                <small id='9ERZ7'></small><noframes id='9ERZ7'>

              1. <tfoot id='9ERZ7'></tfoot>

                <i id='9ERZ7'><tr id='9ERZ7'><dt id='9ERZ7'><q id='9ERZ7'><span id='9ERZ7'><b id='9ERZ7'><form id='9ERZ7'><ins id='9ERZ7'></ins><ul id='9ERZ7'></ul><sub id='9ERZ7'></sub></form><legend id='9ERZ7'></legend><bdo id='9ERZ7'><pre id='9ERZ7'><center id='9ERZ7'></center></pre></bdo></b><th id='9ERZ7'></th></span></q></dt></tr></i><div id='9ERZ7'><tfoot id='9ERZ7'></tfoot><dl id='9ERZ7'><fieldset id='9ERZ7'></fieldset></dl></div>
                  <tbody id='9ERZ7'></tbody>
                  本文介绍了我的代码如何区分编译时常量和变量?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                  问题描述

                  这是我的问题.我有一个 BINARY_FLAG 宏:

                  Here's my problem. I have a BINARY_FLAG macro:

                  #define BINARY_FLAG( n ) ( static_cast<DWORD>( 1 << ( n ) ) )
                  

                  可以像这样使用(常量"场景):

                  Which can be used either like this ("constant" scenario):

                  static const SomeConstant = BINARY_FLAG( 5 );
                  

                  或者像这样(可变"场景):

                  or like this ("variable" scenario):

                  for( int i = 0; i < 10; i++ ) {
                      DWORD flag = BINARY_FLAG( i );
                      // do something with the value
                  }
                  

                  这个宏根本不是万无一失的——你可以通过 -134 那里最多会有一个警告,但行为将是未定义的.我想让它更万无一失.

                  This macro is not foolproof at all - one can pass -1 or 34 there and there will at most be a warning yet behavior will be undefined. I'd like to make it more foolproof.

                  对于常量场景,我可以使用模板:

                  For the constant scenario I could use a template:

                  template<int Shift> class BinaryFlag {
                  staticAssert( 0 <= Shift && Shift < sizeof( DWORD) * CHAR_BIT );
                  public:
                  static const DWORD FlagValue = static_cast<DWORD>( 1 << Shift );
                  };
                  #define BINARY_FLAG( n ) CBinaryFlag<n>::FlagValue
                  

                  但这不适用于可变"场景——我需要一个运行时断言:

                  but this will not go for the "variable" scenario - I'd need a runtime assertion there:

                  inline DWORD ProduceBinaryFlag( int shift )
                  {
                      assert( 0 <= shift && shift < sizeof( DWORD) * CHAR_BIT );
                      return static_cast<DWORD>( 1 << shift );
                  }
                  #define BINARY_FLAG( n ) ProduceBinaryFlag(n)
                  

                  后者很好,但没有编译时检查.当然,我希望在可能的情况下进行编译时检查,否则进行运行时检查.在任何时候,我都希望尽可能少的运行时开销,因此我不希望在可以进行编译时检查时进行函数调用(可能不会被内联).

                  The latter is good, but has no compile-time checks. Of course, I'd like a compile-time check where possible and a runtime check otherwise. At all times I want as little runtime overhead as possible so I don't want a function call (that maybe won't be inlined) when a compile-time check is possible.

                  我看到了这个问题,但看起来不是同一个问题.

                  I saw this question, but it doesn't look like it is about the same problem.

                  是否有一些结构可以根据作为标志号传递的表达式是编译时常量还是变量来允许在两者之间交替?

                  Is there some construct that would allow to alternate between the two depending on whether the expression passed as a flag number is a compile-time constant or a variable?

                  推荐答案

                  不可能将参数传递给宏或函数并确定它是编译时常量还是变量.

                  It's not possible to pass an argument to a macro or function and determine if it's compile time constant or a variable.

                  最好的方法是您#define BINARY_FLAG(n) 使用编译时代码并将该宏放置在任何地方,然后编译它.您将在 n 将成为运行时的地方收到编译器错误.现在,您可以使用运行时宏 BINARY_FLAG_RUNTIME(n) 替换这些宏.这是唯一可行的方法.

                  The best way is that you #define BINARY_FLAG(n) with compile time code and place that macro everywhere and then compile it. You will receive compiler-errors at the places where n is going to be runtime. Now, you can replace those macros with your runtime macro BINARY_FLAG_RUNTIME(n). This is the only feasible way.

                  这篇关于我的代码如何区分编译时常量和变量?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                  上一篇:带有 C++11 的 Visual Studio 2008 下一篇:如何在我的 C++ 源代码中查找(和替换)所有旧的 C 风格数据类型转换?

                  相关文章

                • <i id='mKrRe'><tr id='mKrRe'><dt id='mKrRe'><q id='mKrRe'><span id='mKrRe'><b id='mKrRe'><form id='mKrRe'><ins id='mKrRe'></ins><ul id='mKrRe'></ul><sub id='mKrRe'></sub></form><legend id='mKrRe'></legend><bdo id='mKrRe'><pre id='mKrRe'><center id='mKrRe'></center></pre></bdo></b><th id='mKrRe'></th></span></q></dt></tr></i><div id='mKrRe'><tfoot id='mKrRe'></tfoot><dl id='mKrRe'><fieldset id='mKrRe'></fieldset></dl></div>

                  <tfoot id='mKrRe'></tfoot>

                  1. <small id='mKrRe'></small><noframes id='mKrRe'>

                      <bdo id='mKrRe'></bdo><ul id='mKrRe'></ul>
                  2. <legend id='mKrRe'><style id='mKrRe'><dir id='mKrRe'><q id='mKrRe'></q></dir></style></legend>