代码之家  ›  专栏  ›  技术社区  ›  coneybeare

如何在GCC和Xcode中手动抛出编译器错误

  •  1
  • coneybeare  · 技术社区  · 14 年前

    在xcode中,在使用gcc编译应用程序时,如果发行版启用了NSZombieEnabled之类的功能,我希望抛出编译时间错误,从而确保编译将失败,并且我不会意外地做一些愚蠢的事情。

    4 回复  |  直到 14 年前
        1
  •  13
  •   Mark Rushakoff    14 年前

    使用 the #error directive

    #if SHOULD_FAIL
    #error "bad compiler!"
    #endif
    
    int main()
    {
        return 0;
    }
    
    $ gcc a.c -DSHOULD_FAIL=0 # passes fine
    $ gcc a.c -DSHOULD_FAIL=1
    a.c:2:2: error: #error "bad compiler!"
    

    NSZombieEnabled

    严格来说 #错误 gcc . 但在你描述的情况下这不重要。

        2
  •  1
  •   fbrereto    14 年前

    NSZombieEnabled

        3
  •  1
  •   Joseph Quinsey Taseen    14 年前

    complile time assert()——又称静态断言——可能会有所帮助。这是我的,主要来源于 http://www.pixelbeat.org/programming/gcc/static_assert.html :

    /*-----------------------------------------------------------------------------
     *  Compile-time ASSERT(). Similar to the BOOST_STATIC_ASSERT(). And the C++0x
     *  static_assert(), which also has a parameter for a useless error message
     *  (see correction!). Our ASSERT() can be placed anywhere in the code, except:
     *
     *  o In a twice-included header file, without a #ifndef...#endif wrapper.
     *  o In the middle of a structure definition (or enum definition).
     *  o In C89 or C90, after a statement. But you can wrap it in braces!
     *
     *  If you want stick something in the middle of a structure definition
     *  you'll need to use the ugly, three-line construct #if...#error...#endif.
     *  And if you do do this, the pre-processor has a much more limited idea of
     *  what a "constant expression" is.
     *
     *  This is a refinement of ideas from the web (www.pixebeat.org is good). It
     *  is shorter than BOOST. And, I believe, is better than Linus Torvald's
     *  suggestion for an improved BUILD_BUG_ON(). And the do{...}while(0) wrapper
     *  you commonly see is totally inapplicable here: it limits permissible
     *  locations.
     *
     *  The web has many suggestions using arrays with a negative index. But with
     *  GCC, most of these do not detect a NON-CONSTANT arg (which is easy enough
     *  to do in error), except for the attractive 'extern int foo[expression]',
     *  which also gives an 'unused variable' warning (which might be fixable via
     *  (void)foo). GCC 4.3 apparently has a built-in static_assert(). Update:
     *  typedef int array[expression] seems also to be good.
     */
    #define CONCAT_TOKENS(a, b) a ## b
    #define EXPAND_THEN_CONCAT(a,b) CONCAT_TOKENS(a, b)
    #define ASSERT(e) enum {EXPAND_THEN_CONCAT(ASSERT_line_,__LINE__) = 1/!!(e)}
    

    但是我纠正了我对C++ 0x中“无用”消息的看法:

    /*-----------------------------------------------------------------------------
     *  Correction!: The message in static_assert() isn't quite useless, and we've
     *  added it to ASSERTM(). This is needed for the case where two different
     *  header files happen by chance to have two ASSERT()'s on the same line, or
     *  likewise for a source file and a header file.
     *
     *  We could also handle this via __COUNTER__, but this isn't supported by
     *  the SGI compiler (and is uglier). And we can't use __FILE__, because it
     *  doesn't usually expand to a valid C token (e.g. it has a dot c or dot h).
     */
    #define ASSERTM(e,m) enum{EXPAND_THEN_CONCAT(m##_ASSERT_line_,__LINE__)=1/!!(e)}
    

    一些例子:

    /*-----------------------------------------------------------------------------
     *  Example:
     */
    ASSERTM (sizeof (int16) == 2, my_global_header_h);
    ASSERTM (sizeof (ord32) == 4, my_global_header_h);
    ASSERTM (sizeof (int64) == 8, my_global_header_h);
    
    /*-----------------------------------------------------------------------------
     *  Equally good, I believe, is the following variant, but it is slightly
     *  longer (and not used by us at the present time):
     */
    #define ASSERTt(e) typedef int EXPAND_THEN_CONCAT(ASSERT_line_,__LINE__)[1-2*!(e)]
    
        4
  •  0
  •   Dave DeLong    14 年前

    echo "error: this build step failed!"
    

    或:

    echo "warning: this build step could be potentially faulty"
    

    这些将分别产生错误或警告,并显示在构建结果窗口中。我已经用过几次了 真正地