主要内容

本页翻译不是最新的。点击此处可查看最新英文版本。

预处理器定义 (-D)

替换预处理代码中的宏

描述

在预处理代码中用宏定义替换宏。

设置选项

用户界面(仅限桌面端产品):在您的工程配置中,此选项位于节点上。

用户界面(仅限 Polyspace 平台、桌面端产品):在您的工程配置中,此选项位于目标和编译器节点的编译选项卡中。

命令行选项文件:请使用 -D 选项。请参阅命令行信息

为何使用此选项

使用此选项来模拟您的编译器行为。例如,如果您的编译器认为在构建代码时已定义宏 _WIN32,则它会在 #ifdef _WIN32 语句中执行代码。如果 Polyspace® 认为该宏未被定义,则必须使用此选项将宏替换为 1。

根据您对编译器 (-compiler) 的设置,系统会默认定义一些宏。使用此选项定义未隐式定义的宏。

通常,您可以从编译错误中识别出某个宏未定义。例如,如果未定义宏 _WIN32,则以下代码不会编译。

#ifdef _WIN32
  int env_var;
#endif

void set() {
  env_var=1;
}
错误消息指出未定义 env_var。但是,env_var 的定义位于 #ifdef _WIN32 语句中。错误的根本原因是未定义宏 _WIN32。您必须定义 _WIN32

设置

无默认值

使用 按钮为要定义的宏添加一行。定义的格式必须为 Macro=Value。如果您希望 Polyspace 忽略宏,请将 Value 留空。

例如:

  • name1=name2name2 替换 name1 的所有实例。

  • name= 指示软件忽略 name

  • 不带等号或值的 name 用 1 替换 name 的所有实例。要定义宏以执行 #ifdef macro_name 语句中的代码,请使用此语法。

提示

  • 如果 Polyspace 不支持非 ANSI® 关键字并显示编译错误,请使用此选项将预处理代码中出现的所有该关键字替换为空字符串。仅出于分析目的进行替换。您的原始源代码保持不变。

    例如,如果您的编译器支持 __far 关键字,为避免编译错误,请执行以下操作:

    • 在用户界面(仅限桌面端产品)中,输入 __far=

    • 在命令行中,使用 -D __far= 标志。

    软件在预处理期间将 __far 关键字替换为空字符串。例如:

    int __far* pValue;
    将转换为:
    int * pValue;

  • Polyspace 可识别 restrict 等关键字,但不允许将其用作标识符。如果您将这些关键字用作标识符(因为编译器不会将其识别为关键字),请使用此选项将不允许的名称替换为其他名称。仅出于分析目的进行替换。您的原始源代码保持不变。

    例如,要允许将 restrict 用作标识符,请执行以下操作:

    • 在用户界面中,输入 restrict=my_restrict

    • 在命令行中,使用 -D restrict=my_restrict 标志。

  • 您的编译器设定决定了许多编译器特定的宏的值。如果要了解 Polyspace 如何定义特定宏,请使用 -dump-preprocessing-info 选项。

命令行信息

您只能为每个 -D 选项指定一个标志。但您可以多次指定该选项。

参数:-D
无默认值
值:flag=value
示例 (Bug Finder):polyspace-bug-finder -D HAVE_MYLIB -D int32_t=int
示例 (Code Prover):polyspace-code-prover -D HAVE_MYLIB -D int32_t=int
示例 (Bug Finder Server):polyspace-bug-finder-server -D HAVE_MYLIB -D int32_t=int
示例 (Code Prover Server):polyspace-code-prover-server -D HAVE_MYLIB -D int32_t=int