【发布时间】:2014-03-24 14:25:40
【问题描述】:
在代码审查中,我要求使用下面的选项 (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 constvs#define。我很惊讶您认为枚举符号不在调试信息中,尽管它不会在内存映射中显示为分配的符号。我强烈推荐enum。 -
更新了上面的示例以包含 GDB。似乎只有 A 存在。
-
好奇:在 Ubuntu 12.04 衍生版本和您的代码上使用 GCC 4.8.2 和 GDB 7.7,我得到:
(gdb) br main/Breakpoint 1 at 0x4004df: file gdb.c, line 11./(gdb) r/Starting program: /home/jleffler/soq/gdb-test/Breakpoint 1, main (argc=1, argv=0x7fffffffe1e8) at gdb.c:11/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的符号信息。我不确定你在哪里使用什么,但我对你的工具链的行为感到困惑。 -
有趣。这是在 MacOSX 上,i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1(基于 Apple Inc. build 5658)(LLVM build 2336.1.00)
-
我尝试了几个使用 gcc 3.4.6 和 4.8.1 的 linux 构建。 4.8.1 具有与您相同的输出(适用于枚举)。旧版本有我报告的内容。所以似乎这不是 linux/macos 依赖的,而是在 gcc 版本中修复的东西。所以我认为对于更新的代码,我会倾向于枚举。
标签: c constants declaration