C ++创建全局&的正确方法是什么?静态字符串表?
“global”,我的意思是:可以从任何包含标题的文件中使用。但不是某些运行时创建的singelton objcet的一部分。
通过“静态”,我的意思是:由于很少的运行时间设置可能。只读存储器页面中的数据。每个应用只有1个数据实例。
通过“string”,我的意思是:Null终止的字符数组很好。 std :: string会很好,但我不认为它可以用上面的方法来完成。正确的吗?
“table”,我的意思是:我的意思是一个可索引的数组。所以我猜本身不是一张桌子。但是我在这一点上很灵活。开放的想法。
通过“C ++”,我的意思是:C ++而不是C.(更新:C ++ 98,而不是C ++ 11)
答案 0 :(得分:10)
<强> strings.h 强>
extern const char* table[];
<强> strings.cpp 强>
const char* table[] = {
"Stack",
"Overflow",
}
另一种观点,使用查找表的错误代码:
<强> err.h 强>
#define ERR_NOT_FOUND 0x1004
#define ERR_INVALID 0x1005
bool get_err_msg(int code, const char* &msg);
<强> err.cpp 强>
typedef struct {
int errcode;
const char* msg;
} errmsg_t;
static errmsg_t errmsg_table[] = {
{ERR_NOT_FOUND, "Not found"},
{ERR_INVALID, "Invalid"}
};
#define ERRMSG_TABLE_LEN sizeof(errmsg_table)/sizeof(errmsg_table[0])
bool get_err_msg(int code, const char* &msg){
msg = NULL;
for (int i=0; i<ERRMSG_TABLE_LEN; i++) {
if (errmsg_table[i].errcode == code) {
msg = errmsg_table[i].msg;
return true;
}
}
return false;
}
<强>的main.cpp 强>
#include <stdio.h>
#include "err.h"
int main(int argc, char** argv) {
const char* msg;
int code = ERR_INVALID;
if (get_err_msg(code, msg)) {
printf("%d: %s\n", code, msg);
}
return 0;
}
我确信有更多的C ++方法可以做到这一点,但我真的是一名C程序员。
答案 1 :(得分:6)
使用std::array
字符串文字。它没有构造函数,因此它将像{C}数组一样静态加载到.rodata
部分,但它有一个标准的C ++库接口。 (迭代器,大小等)
<强> A.H 强>:
#include <array>
extern std::array<const char*, 3> A;
<强> A.cpp 强>:
std::array<const char*, 3> A = { "foo", "bar", "baz" };
答案 2 :(得分:4)
我喜欢Jonathon Reinhart的方式,我总是这样做,特别是如果我们有一个元素结构,
但是,它需要一个循环来查找元素(未编入索引), 所以如果你喜欢改进,特别是对于嵌入式系统风格。
enum ERR_INDEX{
ERR_NOT_FOUND=0,
ERR_INVALID,
ERR_BAD_LENGTH,
ERR_MORE_ERR1,
ERR_MORE_ERR2,
ERR_MORE_ERR3,
};
static const char * errmsg_table[] = {
"Not found",
"Invalid",
"bad message length",
"error 1",
"error 2",
"error 3",
};
int main(int argc, char** argv) {
int code = ERR_INVALID;
printf("%d: %s\n", code, errmsg_table[code]);
printf("%d: %s\n", code, errmsg_table[ERR_BAD_LENGTH]);
return 0;
}
答案 3 :(得分:3)
table_n
严格提供,以确保您至少有一个提示有多大:
<强> Table.h 强>
// header file
extern const size_t table_n;
extern const char* table[];
<强> Table.cpp 强>
// c/cpp file
const char *table[] =
{
"one",
"two",
"there"
};
const size_t table_n = sizeof(table)/sizeof(table[0]);
或类似的东西。