我正在试图找出定义具有恒定大小的全局数组的最佳方法,并且我得出以下选项,都有自己的缺陷。
// 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
宏但如果#define
和const
与数组声明位于一个单独的文件中,那么它会有点毛茸茸
有更好的方法吗?
答案 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)
无需为此设置额外的变量。