注册 登录
Office中国论坛/Access中国论坛 返回首页

ganlinlao的个人空间 http://www.office-cn.net/?230471 [收藏] [复制] [分享] [RSS]

日志

Freebasic菜鸟初学Freebasic基础教程四:了解条件编译

已有 2626 次阅读2017-5-8 18:25 |个人分类:FreeBasic| Freebasic教程, freebasic入门, Freebasic

这种能够根据不同情况编译不同代码、产生不同目标文件的机制,称为条件编译。条件编译是预处理程序的功能,不是编译器的功能。

 条件编译有多种形式,下面一一讲解。

#if 命令
#if 命令的完整格式为:
#if 整型常量表达式1
     程序段1
 #elseif 整型常量表达式2
     程序段2
 #elseif 整型常量表达式3
     程序段3
 #else
     程序段4
 #endif
它的意思是:如常“表达式1”的值为真(非0),就对“程序段1”进行编译,否则就计算“表达式2”,结果为真的话就对“程序段2”进行编译,为假的话就继续往下匹配,直到遇到值为真的表达式,或者遇到 #else。这一点和 if else 非常类似。

 需要注意的是,#if 命令要求判断条件为“整型常量表达式”,也就是说,表达式中不能包含变量,而且结果必须是整数;而 if 后面的表达式没有限制,只要符合语法就行。这是 #if 和 if 的一个重要区别。

#elseif 和 #else 也可以省略,如下所示:

    #if __FB_WIN32__
        print "This is Windows!\n"
    #else
       print("Unknown platform!\n"
    #endif
   
    #if __FB_LINUX__
        printf("This is Linux!\n");
    #endif

#ifdef 命令

#ifdef 命令的格式为:
#ifdef  宏名
    程序段1
 #else
     程序段2
 #endif
它的意思是,如果当前的宏已被定义过,则对“程序段1”进行编译,否则对“程序段2”进行编译。

 也可以省略 #else:
#ifdef  宏名
    程序段
#endif

   #ifdef __fb_debug__

      print  "正在使用 Debug 模式编译程序..."
    #else
        print"正在使用 Release 模式编译程序..."
    #endif

当以 Debug 模式编译程序时,宏 _DEBUG 会被定义,预处器会保留第 5 行代码,删除第 7 行代码。反之会删除第 5 行,保留第 7 行。

#ifndef 命令
#ifndef 命令的格式为:
#ifndef 宏名
    程序段1
 #else
     程序段2
 #endif
与 #ifdef 相比,仅仅是将 #ifdef 改为了 #ifndef。它的意思是,如果当前的宏未被定义,则对“程序段1”进行编译,否则对“程序段2”进行编译,这与 #ifdef 的功能正好相反。
区别
最后需要注意的是,#if 后面跟的是“整型常量表达式”,而 #ifdef 和 #ifndef 后面跟的只能是一个宏名,不能是其他的。

 例如,下面的形式只能用于 #if:

#define NUM 10
   #if NUM = 10 or NUM = 20
        print "NUM: " & NUM
    #else
       print "NUM Error"
    #EndIf
    
运行结果:
NUM: 10

再如,两个宏都存在时编译代码A,否则编译代码B:
#define NUM1  10
#define NUM2  20
   #if  Defined(NUM1) And  Defined(NUM2)
     Print  "NUM1:" & NUM1 & Chr(10) & "NUM2: "& NUM2
    #else
       print "Error"
   #EndIf  
   sleep
运行结果:
NUM1: 10, NUM2: 20

 #ifdef 可以认为是 #if defined 的缩写。

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-11-25 07:17 , Processed in 0.057173 second(s), 17 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

返回顶部