How to declare constexpr extern?

前端 未结 6 929
耶瑟儿~
耶瑟儿~ 2020-11-29 07:43

Is it possible to declare a variable extern constexpr and define it in another file?

I tried it but the compiler gives error:

De

6条回答
  •  爱一瞬间的悲伤
    2020-11-29 08:39

    Yes it somewhat is...

    //===================================================================
    // afile.h
    
    #ifndef AFILE
    #define AFILE
    
    #include 
    #include 
    
    enum class IDs {
    
      id1,
      id2,
      id3,
      END
    
    };
    
    // This is the extern declaration of a **constexpr**, use simply **const**
    extern const int ids[std::size_t(IDs::END)];
    
    // These functions will demonstrate its usage
    
    template void Foo() { std::cout << "I am " << id << std::endl; }
    
    extern void Bar();
    
    #endif // AFILE
    
    //===================================================================
    // afile.cpp
    
    #include "afile.h"
    
    // Here we define the consexpr. 
    // It is **constexpr** in this unit and **const** in all other units
    constexpr int ids[std::size_t(IDs::END)] = {
    
      int(IDs::id1),
      int(IDs::id2),
      int(IDs::id3)
    
    };
    
    // The Bar function demonstrates that ids is really constexpr
    void Bar() {
    
      Foo();
      Foo();
      Foo();
    
    }
    
    //===================================================================
    // bfile.h
    
    #ifndef BFILE
    #define BFILE
    
    // These functions will demonstrate usage of constexpr ids in an extern unit
    
    extern void Baz();
    extern void Qux();
    
    
    #endif // BFILE
    
    //===================================================================
    // bfile.cpp
    
    #include "afile.h"
    
    // Baz demonstrates that ids is (or works as) an extern field
    void Baz() {
    
      for (int i: ids) std::cout << i << ", ";
      std::cout << std::endl;
    
    }
    
    // Qux demonstrates that extern ids cannot work as constexpr, though
    void Qux() {
    
    #if 0 // changing me to non-0 gives you a compile-time error...
    
      Foo();
    
    #endif
    
      std::cout << "Qux: 'I don't see ids as consexpr, indeed.'" 
                << std::endl;
    
    }
    
    //===================================================================
    // main.cpp
    
    #include "afile.h"
    #include "bfile.h"
    
    int main(int , char **)
    {
    
      Bar();
      Baz();
      Qux();
    
      return 0;
    }
    

提交回复
热议问题