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

      <small id='R40qR'></small><noframes id='R40qR'>

      1. 在编译时验证 c/c++ 预处理宏中的参数是否为 ARRAY 类型

        Validate an argument is ARRAY type in c/c++ pre processing macro on compile time(在编译时验证 c/c++ 预处理宏中的参数是否为 ARRAY 类型)

        <small id='xUkNE'></small><noframes id='xUkNE'>

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

                <legend id='xUkNE'><style id='xUkNE'><dir id='xUkNE'><q id='xUkNE'></q></dir></style></legend>

                • 本文介绍了在编译时验证 c/c++ 预处理宏中的参数是否为 ARRAY 类型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                  问题描述

                  有什么方法可以在 c 宏中在编译时验证参数是数组吗?

                  Is there any way to validate on compile time in a c macro that an argument is an array ?

                  例如在这两个宏中:

                  #define CLEAN_ARRAY(arr) 
                      do { 
                          bzero(arr, sizeof(arr)); 
                      } while (0)
                  

                  #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
                  

                  我使用 CTC(X) 宏 尝试了一些东西,但找不到任何如果 arr 不是数组,则验证/警告的方法.

                  I tried something using CTC(X) macro , but couldn't find any way to validate/warn if arr isn't an array.

                  推荐答案

                  这是一个纯 C 的解决方案,它不会调用未定义的行为:

                  Here's a solution in pure C which invokes no undefined behavior:

                  #define IS_INDEXABLE(arg) (sizeof(arg[0]))
                  #define IS_ARRAY(arg) (IS_INDEXABLE(arg) && (((void *) &arg) == ((void *) arg)))
                  

                  如果您需要确保该值是一个数组(否则会导致编译时错误),您可以简单地将其用作枚举语句(或静态变量)的初始化程序,如下所示:

                  If you need to ensure that the value is an array (then cause a compile time error if not), you can simply use it as an initializer to an enum statement (or a static variable), like this:

                  static int __ ## arg ## _is_array = IS_ARRAY(arg); // works for an array, fails for pointer.
                  

                  我不完全确定 VLA 会发生什么,但稍微尝试一下应该会很快找到答案.

                  I'm not entirely sure what will happen with VLA's, but playing around a bit should find that answer out rather fast.

                  旧答案:

                  由于这被标记为 C(和 GCC),我将在这里尝试一个解决方案:

                  Since this is tagged C (and GCC), I will attempt a solution here:

                  #define IS_ARRAY(arg) __builtin_choose_expr(__builtin_types_compatible_p(typeof(arg[0]) [], typeof(arg)), 1, 0)
                  

                  另一种解决方案,使用 C11 的 _Generic 特性 &typeof:

                  Another solution, using C11's _Generic feature & typeof:

                  #define IS_ARRAY(arg) _Generic((arg),
                      typeof(arg[0]) *: 0,
                      typeof(arg[0]) [sizeof(arg) / sizeof(arg[0])]: 1
                  )
                  

                  基本上,它所做的只是使用 GCC 的一些奇特功能来确定参数的类型是否与参数元素类型的数组兼容.它将返回 0 或 1,如果您愿意,您可以将 0 替换为会产生编译时错误的内容.

                  Basically, all it does is use some fancy features of GCC to determine if the type of the argument is compatible with an array of the type of the argument's elements. It will return 0 or 1, and you could replace the 0 with something that creates a compile time error if you wish.

                  这篇关于在编译时验证 c/c++ 预处理宏中的参数是否为 ARRAY 类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                  本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

                  相关文档推荐

                  Is Type(::x); valid?(是类型(::x);有效的?)
                  Difference between an inline function and static inline function(内联函数和静态内联函数的区别)
                  Compilation fails randomly: quot;cannot open program databasequot;(编译随机失败:“无法打开程序数据库)
                  Too many initializers error for a simple array in bcc32(bcc32 中的简单数组的初始值设定项过多错误)
                  No Member named stoi in namespace std(命名空间 std 中没有名为 stoi 的成员)
                  Error using a constexpr as a template parameter within the same class(在同一个类中使用 constexpr 作为模板参数时出错)
                • <tfoot id='ta6tt'></tfoot>
                  <i id='ta6tt'><tr id='ta6tt'><dt id='ta6tt'><q id='ta6tt'><span id='ta6tt'><b id='ta6tt'><form id='ta6tt'><ins id='ta6tt'></ins><ul id='ta6tt'></ul><sub id='ta6tt'></sub></form><legend id='ta6tt'></legend><bdo id='ta6tt'><pre id='ta6tt'><center id='ta6tt'></center></pre></bdo></b><th id='ta6tt'></th></span></q></dt></tr></i><div id='ta6tt'><tfoot id='ta6tt'></tfoot><dl id='ta6tt'><fieldset id='ta6tt'></fieldset></dl></div>
                    <tbody id='ta6tt'></tbody>

                  <small id='ta6tt'></small><noframes id='ta6tt'>

                  1. <legend id='ta6tt'><style id='ta6tt'><dir id='ta6tt'><q id='ta6tt'></q></dir></style></legend>
                          • <bdo id='ta6tt'></bdo><ul id='ta6tt'></ul>