2016-07-08 5 views
-4

Я определил массив указателей const в заголовочном файле. Массив содержит несколько строк. Теперь я должен найти строку в определенном индексе. Я не знаю, как мне получить доступ к этому массиву из других файлов. Пожалуйста, смотрите мой код:Глобальный указатель-указатель const в C++

common.h

extern const char *lookup_str[] = {"test Str0", "test Str1", "test Str2", "test Str3"}; 

file1.cpp

int ret = 3; 
std::string r = lookup_str[ret]; 

Могу ли я использовать этот способ во всех моих файлах C? Дайте мне знать, если вы видите альтернативный подход. Любое предложение/помощь очень ценится. Заранее спасибо !

+3

Почему вы используете 'std :: string' в c? – PhotometricStereo

+1

'extern' для деклараций, а не для определений. Вам нужно выбрать один файл .c/.cpp для 'const char * lookup_str [] = {...};' (определение) и в заголовке, вы просто имеете 'extern const char * lookup_str [];' (декларация). –

+0

Извините. Виноват. это файл C++. – Rock26

ответ

1

Объявите переменную без инициализации в файле .h:

extern const char *lookup_str[]; 

Инициализировать его точно в одном исходном файле.

const char *lookup_str[] = {"test Str0", "test Str1", "test Str2", "test Str3"}; 

Чтобы использовать его в файле .cpp, используйте:

#include "common.h" 

... 

int ret = 3; 
std::string r = lookup_str[ret]; 

Лучшей альтернативой, ИМО, было бы обеспечить чисто функциональный интерфейс к данным.

заголовочный файл:

std::string const& lookup_str(size_t index); 

Файл .cpp:

std::string const& lookup_str(size_t index) 
{ 
    static std::vector<std::string> str = {"test Str0", "test Str1", "test Str2", "test Str3"}; 
    return str.at(index); // This will throw exception if index is not 
          // within bounds. 
} 

, а затем использовать его как:

#include "common.h" 

... 

size_t ret = 3; 
std::string r = lookup_str(ret); 

Update

C++ 98 Реализация lookup_str() будет:

std::string const& lookup_str(size_t index) 
{ 
    static std::vector<std::string> str; 
    if (str.empty()) 
    { 
     str.push_back("test Str0"); 
     str.push_back("test Str1"); 
     str.push_back("test Str2"); 
     str.push_back("test Str3"); 
    } 
    return str.at(index); 
} 
+0

Спасибо @R Sahu. Я пробовал ваш подход, но я получил эту ошибку: «error: в C++ 98« str »должен быть инициализирован конструктором, а не« {...} ». Это производственная среда, и мне не разрешено ничего менять. – Rock26

+0

@ Rock26, тогда вам нужно пометить свой вопрос «C++ 98». – kfsone

+0

@ Rock26, см. Обновление –

0

Вы должны избегать определений переменных в файлах заголовков. Вместо этого вы можете получить декларацию , которая просто информирует компилятор о символе, который может быть определен в другом месте и скомпилирован отдельно.

Итак, ваш заголовок должен выглядеть следующим образом:

extern const char *lookup_str[]; // defined elsewhere 

И вы должны добавить это в файл источника (.c) (не имеет значения, один, до тех пор, как это связано в конечном исполняемом):

const char *lookup_str[] = { ... }; 

Затем, чтобы использовать его, просто включите вышеупомянутый заголовок, и использовать его, как и любой массив.

0

Так как вы делаете это в c++, не делают это с c-strings, сделать это на C++ путь:

общий.каст

std::array<std::string, 4> lookup_str = {"test Str0", "test Str1", "test Str2", "test Str3"}; 

common.h

extern std::array<std::string, 4> lookup_str; 

Затем вы можете использовать его таким же образом:

int ret = 3; 
std::string r = lookup_str[ret]; 

Или в удивительный C++ способами:

auto stringInArr = std::find(lookup_str.begin(), lookup_str.end(), "test Str3"); 

Вот живой пример:

http://ideone.com/UFfIyV

-1

уборщика дизайн ИМО будет объявить EXTERN и определение в заголовочном файле разделенного макроопределения

strdef.h

#ifdef STRING_INSTANCE_DEFINE 
const char *lookup_str[] = {"test Str0", "test Str1", "test Str2", "test Str3"}; 
#else 
extern const char *lookup_str[]; 
#endif 

strdef.c

#define STRING_INSTANCE_DEFINE 
#include <strdef.h> 

Все другие файлы

#include <strdef.h> 

Remeber определить макрос STRING_INSTANCE_DEFINE только в 1 .c файл. Все остальные файлы с использованием массива могут просто включать заголовочный файл, и он будет доступен для них как extern.

Смежные вопросы