【发布时间】:2011-03-19 05:28:02
【问题描述】:
“符号”在“加载符号列表”中是什么意思?或者就像 MSDN 中的这个例子:
“#if 让您开始一个条件指令,测试一个或多个符号以查看它们是否为真。”
这些符号在哪里定义和声明?
【问题讨论】:
“符号”在“加载符号列表”中是什么意思?或者就像 MSDN 中的这个例子:
“#if 让您开始一个条件指令,测试一个或多个符号以查看它们是否为真。”
这些符号在哪里定义和声明?
【问题讨论】:
对于“加载符号列表”,符号是编程语言语法中定义的元素。局部变量名是一个符号。类类型标识符是一个符号。 PDB 文件包含符号信息,因此调试器可以知道事物所在的位置以及它们在原始源代码中的名称。
对于#if,“符号”表示预处理器 (c++) 或条件定义 (C#) 符号。 C# 没有预处理器阶段,因此这些术语可能会有些混乱。
您使用#define 定义条件符号:#define WIN32 您测试是否使用#if 定义了符号:#if WIN32 <...>#endif
预处理器符号是无类型的,通常不会与实际上是程序代码一部分的类型和标识符相交。预处理器位于源代码的“上方”。编译后的输出中不存在预处理器符号,并且在运行时不占用任何内存空间。从逻辑上讲,编译器永远不会看到预处理器语法——它在文本到达编译器之前就被删除了。
【讨论】:
PDF files contain symbol information... 我猜你的意思是PDB files...
“符号”在计算机科学中是一个相当宽泛(并且重载/模棱两可)的术语。维基百科有一篇关于它们的文章:Identifier/Symbol/Token。
但是,就您而言,您正在查看影响编译结果的预处理器(预编译器)指令。
对于#if,“符号”只是一个变量;一个这样的“符号”是DEBUG,可以像这样使用:
#if DEBUG
如果代码在 Debug 模式下编译,“Debug”符号将计算为 true - 因此在这些情况下,#if 块中的代码将被发送到编译器。
您还可以使用#define 创建一个符号并(或多或少)将其值设置为true。因此,未定义符号的计算结果为 false,而已定义符号的计算结果为 true
【讨论】:
#define X 后跟 #if X 会导致语法错误,因为 X 扩展为没有标记。需要#ifdef X 或#if defined X 来测试是否定义了符号。要直接使用#if 指令对其进行测试,它必须扩展到一些其他标记,例如1。
您还可以添加自己的符号以在代码中使用或删除内置符号。如果您使用 Visual Studio,您可以在项目的“属性”下执行此操作,然后在“构建”选项卡下执行此操作。 如果您不使用 Visual Studio,我会怀疑这些符号是在您编译程序时添加到命令行的。
/维克托
【讨论】: