我试图找出定义具有恒定大小的全局数组的最佳方法,并且我得出以下选项,所有这些都有自己的缺陷.
// 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];
Run Code Online (Sandbox Code Playgroud)
前两个问题是我无法ASIZE从GDB 获得价值.我想第三种选择是最好的,因为我仍然可以转储它的值const,但它也会在另一个宏中泄漏.我可以undef在定义数组后使用宏,const但如果#define和const它们在数组声明的单独文件中,那么它会有点毛茸茸.
有没有更好的办法?
为调试器做某事是错误的.顺便说一下,如果你正确编译代码,gdb就会知道这一点.
某些语言(如C和C++)提供了一种定义和调用"预处理器宏"的方法,这些宏可以扩展为令牌字符串.gdb可以计算包含宏调用的表达式,显示宏扩展的结果,并显示宏的定义,包括它的定义位置.
3.1及更高版本的GCC,GNU C编译器,提供了如果指定的选项宏观信息
-gdwarf-2和-g3; 前一个选项以Dwarf 2格式请求调试信息,后者请求"额外信息".
您正在处理GDB问题,而不是C问题.你也可以做#4,这可能比#3好.
enum {ASIZE = 10};
static const int ASIZE_FOR_GDB = ASIZE;
int array[ASIZE];
Run Code Online (Sandbox Code Playgroud)
我的理解是你定义了一个常量,稍后使用它来调整一个或多个数组的大小,并且还希望该常量是一个符号,最好没有一个混乱的命名空间.(如果是导出单个数组的大小的问题,我会建议sizeof(array) / sizeof(*array)missno做.)
static const int ASIZE = 10;
#define ASIZE 10
int array[ASIZE];
Run Code Online (Sandbox Code Playgroud)
这里有一个带有所需值的变量,它将在目标文件中,但预处理器宏会使用值本身对其进行遮蔽,因此数组定义也会成功.
但是,您可能会发现需要复制值表达式丑陋.如果我们可以根据宏定义变量,那不是很好吗?
static const int ASIZE =
#define ASIZE 10
ASIZE;
int array[ASIZE];
Run Code Online (Sandbox Code Playgroud)
我不确定这实际上是否比上述更好的可维护性,但是它有效(并且我不能让gcc被它冒犯)并且除了标识符之外它不包含任何重复.这很有趣.