在2016年奥卢ISO C++标准会议上,一项名为Inline Variables的提案被标准委员会投票选为C++ 17.
通俗地说,什么是内联变量,它们如何工作以及它们对什么有用?如何声明,定义和使用内联变量?
见主题.他们在想什么?
更新:从"静态"更改为"内部链接"以避免混淆.
举个例子......把以下内容放在一个文件中:
const int var_a = 1;
int var_b = 1;
Run Code Online (Sandbox Code Playgroud)
......并g++ -c test.cpp仅用出口进行编译var_b.
是否可以声明一个变量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) 我有一个foo包含整数的命名空间bar,声明如此...
foo.h中:
namespace foo {
int bar;
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我foo.h只包含一个文件,这就可以了.但是当我foo.h从两个或更多文件中包含时出现问题:我收到链接器错误.我想出如果我声明bar为static,我可以包含foo.h在多个文件中.这对我来说似乎很奇怪,因为我不知道可以在命名空间内声明一个静态变量.(那有什么意思?)
为什么这样做?更重要的是,为什么没有它的工作没有 static?static在用于什么时意味着什么namespace?
我想跨多个c文件共享某些C字符串常量.常量跨越多行以便于阅读:
const char *QUERY = "SELECT a,b,c "
"FROM table...";
Run Code Online (Sandbox Code Playgroud)
上面的操作给出了QUERY的重新定义错误.我不想使用宏,因为每行后都需要退格'\'.我可以在单独的c文件中定义这些并在h文件中对变量进行extern但是我觉得这样做很懒.
有没有其他方法可以在C中实现这一目标?
// MyClass.h
namespace MyNamespace {
static const double GasConstant = 1.987;
class MyClass
{
// constructors, methods, etc.
};
}
Run Code Online (Sandbox Code Playgroud)
我以前在MyClass声明中声明了GasConstant(并且在源文件中有一个单独的定义,因为C++不支持const非整数类型的初始化).然而,我需要从其他文件访问它,从逻辑上看,它似乎应该驻留在命名空间级别.
我的问题是,static const在这种情况下会产生什么影响?显然const意味着我无法为GasConstant分配新值,但命名空间中的静态成员意味着什么.这类似于文件范围内的静态,其中成员在单元外是不可访问的吗?
我的代码中有以下三个文件(删除了大部分代码。这只是为了隔离问题)。
全局.h:
//global.h
#ifndef GLOBAL_H
#define GLOBAL_H
extern const int ARRAYSIZEX;
extern const int ARRAYSIZEY;
extern const int ARRAYSIZEZ;
#endif //GLOBAL_H
Run Code Online (Sandbox Code Playgroud)
全局.cpp:
//global.cpp
#include "global.h"
const int ARRAYSIZEX = 5;
const int ARRAYSIZEY = 2;
const int ARRAYSIZEZ = 4;
Run Code Online (Sandbox Code Playgroud)
主要的:
//main
#include "global.h"
using namespace std;
someType mySomeTypeArray[ARRAYSIZEX][ARRAYSIZEY][ARRAYSIZEZ];
int main(int argc, char **argv)
{
//...
}
Run Code Online (Sandbox Code Playgroud)
编译在 mySomeTypeArray 的声明处出现了三个错误。
错误:数组边界不是“]”标记之前的整数常量
我想将我的全局变量和数组大小定义保留在该应用程序的 global.h/cpp 中,只是为了组织,以便我的所有配置参数都位于一处。实现我想要做的事情的正确方法是什么?
谢谢
我们的系统中有一段C代码,其中包含一些具有全局访问权限的数组:
source.h
extern const int magic[5];
Run Code Online (Sandbox Code Playgroud)
由source.c:
const int magic[] = { 1, 2, 3, 4, 5};
Run Code Online (Sandbox Code Playgroud)
有人认为将其更改为C++是一个好主意,所以上面的结果是一个extern "C"块:
source.h:
extern "C" {
const int magic[5];
}
Run Code Online (Sandbox Code Playgroud)
source.cc:
extern "C" {
const int magic[] = { 1, 2, 3, 4, 5};
}
Run Code Online (Sandbox Code Playgroud)
编译时没有使用gcc -Wall发出吱吱声
直到有人试图使用该阵列我们发现了问题.使用const一个内部extern "C"的原因没有外部符号在所有生成.这发生在gcc,sun workshop和ibm的编译器上.
考虑到gcc没有警告你,你做的事情很奇怪,我有点不知道这是否是预期的行为.
这个标准所规定的行为也是如此,还是一个相当普遍的错误?