如何申报constexpr extern?

col*_*rew 39 c++ extern constexpr

是否可以声明一个变量extern constexpr并在另一个文件中定义它?

我试了但是编译器给出了错误:

constexpr变量' i'的声明不是定义

在.h:

extern constexpr int i;
Run Code Online (Sandbox Code Playgroud)

在.cpp中:

constexpr int i = 10; 
Run Code Online (Sandbox Code Playgroud)

swa*_*ang 23

不,你不能这样做,这就是标准所说的(第7.1.5节):

1 constexpr说明符只能应用于变量或变量模板的定义,函数或函数模板的声明,或文字类型的静态数据成员的声明(3.9).如果函数,函数模板或变量模板的任何声明都有constexpr说明符,那么它的所有声明都应包含constexpr说明符.[注意:显式特化可能与constexpr说明符的模板声明不同.函数参数不能声明为constexpr. - 结束说明]

标准给出的一些例子:

  constexpr void square(int &x);  // OK: declaration
  constexpr int bufsz = 1024;  // OK: definition
  constexpr struct pixel {  // error: pixel is a type
    int x;
    int y;
    constexpr pixel(int);  // OK: declaration
  };

  extern constexpr int memsz; // error: not a definition
Run Code Online (Sandbox Code Playgroud)


Cir*_*四事件 7

C ++ 17 inline变量

强大的C ++ 17功能使我们能够:

  • 方便地为每个常量使用一个内存地址
  • 将其存储为 constexpr
  • 从一个标题中一行完成

main.cpp

#include <cassert>

#include "notmain.hpp"

int main() {
    // Both files see the same memory address.
    assert(&notmain_i == notmain_func());
    assert(notmain_i == 42);
}
Run Code Online (Sandbox Code Playgroud)

notmain.hpp

#ifndef NOTMAIN_HPP
#define NOTMAIN_HPP

inline constexpr int notmain_i = 42;

const int* notmain_func();

#endif
Run Code Online (Sandbox Code Playgroud)

notmain.cpp

#include "notmain.hpp"

const int* notmain_func() {
    return &notmain_i;
}
Run Code Online (Sandbox Code Playgroud)

编译并运行:

g++ -c -o notmain.o -std=c++17 -Wall -Wextra -pedantic notmain.cpp
g++ -c -o main.o -std=c++17 -Wall -Wextra -pedantic main.cpp
g++ -o main -std=c++17 -Wall -Wextra -pedantic main.o notmain.o
./main
Run Code Online (Sandbox Code Playgroud)

GitHub上游

C ++标准保证地址相同。C ++ 17 N4659标准草案 10.1.6“内联说明符”:

6具有外部链接的内联函数或变量在所有翻译单元中应具有相同的地址。

cppreference https://zh.cppreference.com/w/cpp/language/inline解释说,如果static未给出,则具有外部链接。

另请参阅:内联变量如何工作?

已在GCC 7.4.0,Ubuntu 18.04中测试。

  • 但这并不能回答问题。你肯定在标题中定义了它。 (2认同)

gas*_*128 6

您可能想要的是 extern 和 constexpr 初始化,例如:

// in header
extern const int g_n;

// in cpp
constexpr int g_n = 2;
Run Code Online (Sandbox Code Playgroud)

尽管在 Visual Studio 2017 中这仅通过一致性模式提供支持: