Статическая строка буквальная таблица?

Как правильно в C ++ создать глобальный & статическая таблица строк?

Под «глобальным» я имею в виду: Используется из любого файла, который включает в себя заголовок. Но не часть какого-то времени выполнения созданного сингелтон-объекта.

Под «статическим» я подразумеваю: как можно меньше времени работы. Данные в страницах памяти только для чтения. Только 1 экземпляр данных на приложение.

Под «строкой» я подразумеваю: массив символов с нулевым символом в конце подходит. std :: string было бы неплохо, но я не думаю, что это можно сделать с точки зрения вышеизложенного. Правильный?

Под «таблицей» я подразумеваю: я имею в виду индексируемый массив. Так что я не думаю, что таблица сама по себе. Но я гибок в этом вопросе. Открыты для идей.

Под «C ++» я имею в виду: C ++, а не C. (Обновление: C ++ 98, а не C ++ 11)

13

Решение

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.

10

Другие решения

Использовать std::array строковых литералов. У него нет конструктора, поэтому он будет загружен статически в .rodata раздел, как массив C, но он имеет стандартный интерфейс библиотеки C ++. (итераторы, размер и т. д.)

хиджры:

#include <array>

extern std::array<const char*, 3> A;

a.cpp:

std::array<const char*, 3> A = { "foo", "bar", "baz" };

http://en.cppreference.com/w/cpp/container/array

6

Мне нравится путь Джонатона Рейнхарта, я всегда так делаю, особенно если у нас есть структура элементов,

тем не менее, требуется цикл для поиска элементов (не индексируется),
так что если вам нравится улучшение, особенно для стиля встраиваемых систем.

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;
}
4

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]);

Или что-то типа того.

3
По вопросам рекламы [email protected]