是否可以声明一个变量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) 在C#中声明的静态变量如下:
private const string Host = "http://80dfgf7c22634nbbfb82339d46.cloudapp.net/";
private const string ServiceEndPoint = "DownloadService.svc/";
private const string ServiceBaseUrl = Host + ServiceEndPoint;
public static readonly string RegisteredCourse = ServiceBaseUrl + "RegisteredCourses";
public static readonly string AvailableCourses = ServiceBaseUrl + "Courses";
public static readonly string Register = ServiceBaseUrl + "Register?course={0}";
Run Code Online (Sandbox Code Playgroud)
如何在另一个类中调用此静态变量?
我对为什么在我的 extern.cpp 文件的定义中需要extern或不需要intvs感到困惑char*。我有以下测试程序:
// extern.cpp
extern const int my_int = 1;
const char* my_str = "FOO";
Run Code Online (Sandbox Code Playgroud)
// main.cpp
#include <iostream>
extern const int my_int;
extern const char* my_str;
int main() {
std::cout << my_int;
std::cout << my_str;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果我删除externfromextern const int my_int = 1;那么我得到undefined reference to 'my_int'. 如果我将 extern 添加到const char* my_str = "FOO";然后我会收到警告'my_str' initialized and declared 'extern'。我为什么需要extern上my_int,但将它添加到 …
在我的项目中,我有很多枚举,需要有与枚举成员相关的其他属性和与枚举类型相关的辅助静态方法.
据我所知,这对于标准枚举类MyItem {...}是不可能的,所以对于我项目中的每个枚举类,我有一个辅助类MyItemEnum,它封装了这些辅助静态方法,并且还实例化了辅助实例本身,以便我可以访问他们的方法,以获得其他属性.
Bellow一个例子(尽可能简化,但我相信所讨论的所有功能都在那里).
MyItem.h
enum class MyItem : unsigned int {
Item1 = 1,
Item2 = 5
};
class MyItemEnum {
private:
MyItem myItem;
size_t extInfo;
MyItemEnum(const MyItem& myItem, size_t extInfo);
~MyItemEnum();
public:
static MyItemEnum Item1;
static MyItemEnum Item2;
static const MyItemEnum &get(MyItem myItem);
operator MyItem() const;
size_t getExt() const;
bool hasNext() const;
MyItem next() const;
};
Run Code Online (Sandbox Code Playgroud)
我认为意思是显而易见的,我不需要在这里提供.cpp部分...当我需要访问扩展功能时,我使用MyItem作为参数在接口和MyItemEnum中传递.
我的第一个问题是,上面的方法是否正常,或者我应该考虑一些完全不同的东西?
我的第二个问题涉及我使用constexpr尝试做的这个枚举的优化:
enum class MyItem : unsigned int {
Item1 = 1,
Item2 = 5
};
class MyItemEnum {
private:
MyItem …Run Code Online (Sandbox Code Playgroud) 因此,我知道在C ++中,如果静态成员是const文字类型,则可以在类内部对其进行初始化,如下所示:
class test{
public:
static constexpr int stc = 1;
private:
int a = 0;
int b = 0;
int c = 0;
};
Run Code Online (Sandbox Code Playgroud)
静态constexpr变量stc可以用在编译器可以直接替换成员值的地方,即
int main () {int array[test::stc];}
Run Code Online (Sandbox Code Playgroud)
但是,如果在不能由编译器直接替换值的上下文中使用:
int main() { const int &cs = test::stc; }
Run Code Online (Sandbox Code Playgroud)
然后编译器(c)生成一个错误
c++ -std=c++11 -pedantic t.cpp -o t
Undefined symbols for architecture x86_64:
"test::stc", referenced from:
_main in t-a8ee2a.o
ld: symbol(s) not found for architecture x86_64
Run Code Online (Sandbox Code Playgroud)
除非静态成员是在类外部定义的,例如:
constexpr int test::stc;
为什么会这样呢?
在C++中,标记的成员static由给定类的所有实例共享.它是否为私有不会影响一个变量由多个实例共享的事实.如果有任何代码会尝试修改它,那么在那里使用const会警告你.
如果它是严格的private,那么该类的每个实例都将获得自己的版本(尽管优化器).
这是我在这里读到的.我的问题是,为什么最好static const int不要将所需的变量放入private?我知道每个对象都会有自己的,但为什么它会变坏?
我有一个全局唯一值,我希望在exe和不同的DLL中使用它.
对于任何希望使用它的项目,它们可能只包括 defs.h
我想知道,我应该声明它
// defs.h
const UINT UNIQUE_MESSAGE =
RegisterWindowMessage(_T("UNIQUE_MESSAGE-{E5476FDB-3E7E-4113-8132-1D87709BC46C}"));
Run Code Online (Sandbox Code Playgroud)
要么
// defs.h
const static UINT UNIQUE_MESSAGE =
RegisterWindowMessage(_T("UNIQUE_MESSAGE-{E5476FDB-3E7E-4113-8132-1D87709BC46C}"));
Run Code Online (Sandbox Code Playgroud)
目前,我没有发现任何与代码消费者不同的观点.是否有任何陷阱?我应该使用static与否?
我有const char * FILENAME = "a/file/name"两个.cpp文件中定义的变量,名为a.cpp和b.cpp.没有任何内容直接包含这些文件,它们只包含a.h和b.h分别包含在自身中.然后包含这两个头文件main.cpp
我的问题是我收到以下链接器错误:
a.obj : error LNK2005: "char const * const FILENAME" (?FILENAME@@3PBDB) already defined in b.obj
我不经常使用文件范围变量,所以我认为这样就可以了......我在这里做错了什么?