Unit test that a class is non copyable, and other compile-time properties

前端 未结 3 1295
南旧
南旧 2020-12-03 16:56

Is there a way to test compile-time errors, but without actually generating the error? For example, if I create a class which is non-copyable, I\'d like to test the fact tha

3条回答
  •  广开言路
    2020-12-03 18:01

    You can do it using make. Each test will be a code snippet. Here's a working example with 2 tests for VC++. (I've used 2 batch files for pass test and fail test). I'm using GNU make here.

    Makefile:

    
    FAILTEST = .\failtest.bat
    PASSTEST = .\passtest.bat
    
    tests: must_fail_but_passes \
        must_pass_but_fails
    
    must_fail_but_passes:
        @$(FAILTEST) $@.cpp
    
    must_pass_but_fails:
        @$(PASSTEST) $@.cpp
    
    

    must_pass_but_fails.cpp

    
    struct Foo {
        int value_;
        Foo(void) : value_(0) {}
      private:
        Foo(const Foo&);
        const Foo& operator=(const Foo&);
    };

    int main() { Foo f(12); return 0; }

    must_fail_but_passes.cpp

    
    struct Foo {
        int value_;
        Foo(int value) : value_(value) {}
      private:
        Foo(const Foo&);
        const Foo& operator=(const Foo&);
    };

    int main() { Foo f(12); return 0; }

    passtest.bat

    
    @echo off
    cl /nologo %1 >NUL
    if %errorlevel% == 0 goto pass
    @echo %1 FAILED
    :pass
    

    failtest.bat

    
    @echo off
    cl /nologo %1 >NUL
    if not %errorlevel% == 0 goto pass
    @echo %1 FAILED
    :pass
    

    Note that cl.exe (i.e. Visual Studio compiler) need to be in your path for this to "just work"

    Have fun!

    P.S. I doubt that this would make me famous though :-)

提交回复
热议问题