2010-01-04 90 views
0

我在头文件中有如下的静态数组:定义全局数组

static MyStruct_t MyStructArray[] = { 
    ...... 
    ...... 
    ......  
} 

但是GCC发出警告:

warning: `MyStructArray' defined but not used 

什么是处理这种情况的正确方法是什么?

UPD:

定义数组为const:

const MyStruct_t MyStructArray[] = { 
    ...... 

修复thwe情况。那么头文件中extern或const的首选方式是什么?

回答

5

因为你已经在头文件中声明了数组是静态的,所以每个编译单元(即预处理的.cpp文件)都会得到它自己的数组拷贝 - 几乎肯定不是你想要的,你得到的确实原因“已定义但未使用”错误。

相反,你可能想这你的头文件:

extern MyStruct_t *MyStructArray; 

......然后正好1 .cpp文件:

MyStruct_t MyStructArray[] = { ...}; 
+1

我在考虑extern,但认为数组必须定义为“extern MyStruct_t MyStructArray [];”。在这种情况下它有什么关系? – dimba 2010-01-04 08:41:57

+0

@idimba:这也可以。事实上,这可能比我说的更正确。 – 2010-01-08 08:24:48

1

它发出警告,因为数组未在代码中引用。将数组注释掉,警告将消失。

+0

它不是在“所有”cpp文件中引用,而是在一些cpp文件中使用它。 – dimba 2010-01-04 08:37:10

+0

@idimba是的,通过使用static关键字,您可以在每个cpp文件中获得一个独特的数组。所以这些数组中的一些实际上没有被引用。 – 2010-01-04 08:42:08

1

随着错误消息指出,该阵列定义,但未使用。如果你不想使用它,那么......不要定义它!

此外,您希望它是静态的并且您在头文件中定义它,这看起来很奇怪。这些是相反的事情。

到正确的操作方式,是声明在头文件数组:

MyStruct_t MyStructArray[]; 

且在一个C文件(一个编译单元)对其进行定义。

MyStruct_t MyStructArray[] = { 
    ...... 
    ...... 
    ......  
} 

但请注意,您不能以这种方式使其具有静态。

1

如果这个阵列是公开的,那么你很可能想把它做成extern而不是static(这是导致警告的原因)。