如何在头文件中定义字符串数组?

时间:2012-02-08 15:56:54

标签: c string header-files

我有很多不同的3轴传感器,我正在编写测试代码。在每个C文件中,我都定义了相同的字符串:

char axis[3][8] = {"X", "Y", "Z"}

我在“for”循环结果时使用它来打印失败的轴:

DEVICETEST_LOG("%s Failed %s axis for Min range\n",device_name[DUT], axis[i]);

我正在考虑节省一些空间,我可以在头文件中定义一个字符串数组,以便在整个地方使用。

我已经尝试了很多东西,但我似乎无法在我的头文件中定义一个字符串数组,我可以迭代通过编译。

5 个答案:

答案 0 :(得分:21)

如果您必须将其放在标头文件中,请使用externstatic

// option 1
// .h
extern char axis[3][8];

// .c
char axis[3][8] = { "X", "Y", "Z" };

// option 2
// .h
static char axis[3][8] = { "X", "Y", "Z" };

Extern告诉链接器在我们的一个实现文件中定义了一个名为axis的全局变量(即在一个.c文件中),我需要在这里引用它。

另一方面,

static告诉编译器相反的情况:我需要能够查看并使用此变量,但不要将其导出到链接器,因此无法通过extern或引起命名冲突。

答案 1 :(得分:12)

为了避免链接器错误,您必须在头文件中将数组声明为extern,然后在其中一个代码模块中定义一次数组。

例如:

//myheader.h
extern const char* axis[3];

然后在另一个代码模块中:

//myfile.c
const char* axis[3] = { "X", "Y", "Z" };

答案 2 :(得分:2)

将它放在头文件中

extern char axis[3][8];

并将其保存在C文件中:

char axis[3][8] = {"X", "Y", "Z"};

答案 3 :(得分:2)

将此添加到标题中:

extern char *axis[];

将其添加到项目中的一个源文件中:

char *axis[] = { "X", "Y", "Z", "Time", "Space", "The Scary Door" };

答案 4 :(得分:0)

Michael Barr(Netrino)建议不要在头文件中声明存储。同样,Netrino嵌入式系统编码标准也不容忍在标题中使用外部存储。

我通常同意这些原则,并且我发现将存储器外部存储到需要它的C文件中是个好主意,而且只有那些。