我有很多不同的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]);
我正在考虑节省一些空间,我可以在头文件中定义一个字符串数组,以便在整个地方使用。
我已经尝试了很多东西,但我似乎无法在我的头文件中定义一个字符串数组,我可以迭代通过编译。
答案 0 :(得分:21)
如果您必须将其放在标头文件中,请使用extern
或static
:
// 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文件中是个好主意,而且只有那些。