在代码审查中,我要求使用选项(1),因为它会创建一个符号(用于调试),而选项(2)和(3)似乎在gcc和icc中不会这样做。但是(1)并不是真正的const,不能在所有编译器上作为数组大小使用。有没有更好的选项,既包括调试符号又真正地是C中的const?
符号:
符号:
gcc f.c -ggdb3 -g ; nm -a a.out | grep _sym
0000000100000f3c s _symA
0000000100000f3c - 04 0000 STSYM _symA
代码:
static const int symA = 1; // 1
#define symB 2 // 2
enum { symC = 3 }; // 3
GDB 输出:
(gdb) p symA
$1 = 1
(gdb) p symB
No symbol "symB" in current context.
(gdb) p symC
No symbol "symC" in current context.
为了完整起见,这里提供原始资料:
#include <stdio.h>
static const int symA = 1;
#define symB 2
enum { symC = 3 };
int main (int argc, char *argv[])
{
printf("symA %d symB %d symC %d\n", symA, symB, symC);
return (0);
}
static const
vs#define
。我很惊讶你认为枚举符号不在调试信息中,尽管它不会显示为内存映射中分配的符号。我强烈推荐使用enum
。 - Jonathan Leffler(gdb) br main
在文件gdb.c的第11行设置断点1。
(gdb) r
正在启动程序:/home/jleffler/soq/gdb-test
在gdb.c的第11行,main函数 (argc=1, argv=0x7fffffffe1e8)被中断。
11 printf("symA %d symB %d symC %d\n", symA, symB, symC);
(gdb) p symC
$1 = symC
(gdb) p (int)symC
$2 = 3
这表明在此平台上的GCC包含了symC
的符号信息。我不确定您使用的是什么工具链,但对于您的工具链的行为感到困惑。 - Jonathan Leffler