条件编译ifndef、ifdef、endif

时间:2023-03-10 06:06:54
条件编译ifndef、ifdef、endif

1、条件编译命令最常见的形式为:

    #ifdef 标识符
程序段1
#else
程序段2
#endif

当标识符已经被定义过(一般是用#define命令定义),则对程序段1进行编译,否则编译程序段2。 其中#else部分也可以没有,即:

     #ifdef
程序段1
#endif

2、条件编译命令另一种形式:

     #ifndef 标识符
程序段1
#else
程序段2
#endif

只是第一行与第一种形式不同:将“ifdef”改为“ifndef”。它的作用是:若标识符未被定义则编译程序段1,否则编译程序段2。这种形式与第一种形式的作用相反。

3、条件编译的例子

我们有一个数据类型,在Windows平台中,应该使用long类型表示,而在其他平台应该使用float表示,这样往往需要对源程序作必要的修改,这就降低了程序的通用性。可以用以下的条件编译:

     #ifdef WINDOWS
#define MYTYPE long
#else
#define MYTYPE float
#endif

如果在Windows上编译程序,则可以在程序的开始加上

     #define WINDOWS 

这样则编译下面的命令行: 
    #define MYTYPE long 
     
如果在这组条件编译命令之前曾出现以下命令行:

     #define WINDOWS 0 

则预编译后程序中的MYTYPE都用float代替。

通常对于顶层的程序使用下面两条语句保证

底层程序中的条件编译的正常执行!

      `ifndef GUARD_INTERFACE
`define GUARD_INTERFACE

4、verilog中的条件编译的例子

// Style #1: Only single `ifdef
`ifdef <FLAG>
// Statements
`endif // Style #2: `ifdef with `else part
`ifdef <FLAG>
// Statements
`else
// Statements
`endif // Style #3: `ifdef with additional ifdefs
`ifdef <FLAG1>
// Statements
`elsif <FLAG2>
// Statements
`elsif <FLAG3>
// Statements
`else
// Statements
`endif