C中的常量大小全局数组

时间:2011-12-05 17:23:44

标签: c gdb

我正在试图找出定义具有恒定大小的全局数组的最佳方法,并且我得出以下选项,都有自己的缺陷。

// 1:
#define ASIZE 10
int array[ASIZE];

// 2:
enum {ASIZE = 10};
int array[ASIZE];

// 3:
#define ASIZE_DEF 10
static const int ASIZE = ASIZE_DEF;
int array[ASIZE_DEF];

前两个问题是我无法从GDB获取ASIZE的值。我想第三种选择是最好的,因为我仍然可以转储const的值,但它也会在另一个宏中泄漏。在定义数组和undef之后,我可以const宏但如果#defineconst与数组声明位于一个单独的文件中,那么它会有点毛茸茸

有更好的方法吗?

4 个答案:

答案 0 :(得分:8)

为调试器做某事是错误的。顺便提一下,gdb knows about this如果你compile your code right

  

某些语言(如C和C ++)提供了一种定义和调用的方法   “预处理器宏”,它扩展为令牌字符串。 gdb可以   计算包含宏调用的表达式,显示结果   宏扩展,并显示宏的定义,包括它的位置   定义

     

gnu C编译器的gcc 3.1及更高版本提供了宏   如果您指定选项-gdwarf-2-g3,则会显示相关信息;前者   选项以Dwarf 2格式请求调试信息,以及   后者要求“额外信息”。

答案 1 :(得分:5)

您正在处理GDB问题,而不是C问题。你也可以做#4,这可能比#3好。

enum {ASIZE = 10};
static const int ASIZE_FOR_GDB = ASIZE;
int array[ASIZE];

答案 2 :(得分:5)

我的理解是你正在定义一个常量,稍后使用它来调整一个或多个数组的大小,并且还希望该常量是一个符号,最好没有一个混乱的命名空间。 (如果是导出单个数组大小的问题,我建议将sizeof(array) / sizeof(*array)建议为missno。但

static const int ASIZE = 10;
#define ASIZE            10
int array[ASIZE];

这里有一个带有所需值的变量,它将在目标文件中,但预处理器宏会使用值本身对其进行遮蔽,因此数组定义也会成功。

但是,您可能会发现需要复制值表达式丑陋。如果我们可以根据宏来定义变量,那不是很好吗?

static const int ASIZE =
#define ASIZE 10
                         ASIZE;
int array[ASIZE];

我不确定这实际上是否比上述更好的可维护性,但是它有效(并且我无法通过它冒犯gcc)并且它不包含除标识符之外的重复。这很有趣。

答案 3 :(得分:2)

既然你知道array是一个全局数组(而不只是一个指针),你可以使用

找到它的长度
sizeof(array) / sizeof(*array)

无需为此设置额外的变量。