C ++中的全局const char指针数组

时间:2016-07-08 23:32:24

标签: c++ arrays pointers

我在头文件中定义了一个const char指针数组。数组包含多个字符串。现在我必须在特定索引处找到一个字符串。我不知道应该如何从其他文件访问此数组。请看我的代码:

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文件中使用这种方式吗?如果您能看到任何替代方法,请告诉我。任何建议/帮助非常感谢。提前谢谢!

4 个答案:

答案 0 :(得分: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];

更好的替代方案IMO将为数据提供纯粹的功能接口。

.h文件:

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

<强>更新

lookup_str()的C ++ 98实现将是:

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

答案 1 :(得分:0)

您应避免在头文件中使用变量定义。相反,你可以有一个声明,它只是告诉编译器一个符号,它可以在别处定义,并单独编译。

因此,您的标题应如下所示:

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

你应该将它添加到一个源(.c)文件(无论哪一个,只要它链接到最终的可执行文件):

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

然后使用它,只需包含上述标题,并像使用任何数组一样使用它。

答案 2 :(得分:0)

由于您是在c++中执行此操作,请勿使用c-strings执行此操作,请按c ++方式执行此操作:

common.cpp

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

答案 3 :(得分:-1)

更清洁的设计IMO将在由宏定义分隔的头文件中声明extern和定义

<强> strdef.h

#define STRING_INSTANCE_DEFINE
#include <strdef.h>

<强> strdef.c

#include <strdef.h>

所有其他文件

grails.project.dependency.resolution = {
    repositories {
        grailsPlugins()
        grailsHome()
        mavenLocal()
        grailsCentral()
        mavenCentral()
    }
}

请记住仅在1个 .c 文件中定义宏 STRING_INSTANCE_DEFINE 。使用该数组的所有其他文件可以只包含头文件,并且它们可以作为extern使用。