C语言:条件编译的标识符不能放在程序里面宏定义吗?

定义是可以的,叫做条件编译。

c语言条件编译_c语言条件编译指令c语言条件编译_c语言条件编译指令


c语言条件编译_c语言条件编译指令


c语言条件编译_c语言条件编译指令


在再前面,加一个语句

#define

BZ

编译的时候,就会编译“程序1”,而不编译“程序2”;

如果前面,以及include的文件里面都没有BZ的定义,编译时,就不会编译“程序1”,而是编译“程序2”

if

else

就错了。

#ifdef

BZ,仅仅是说BZ已经定义,与其值没有任何关系,你让他=0,=别的什么,不会影响#ifdef的行为。

条件编译是编译时的选项,与运行时无关,你不能在运行时做什么选择。

从if语句看,你的条件是a=1,不是BZ是否定义。

MACRO是在编译时展开的。

你的这种用法是说在运行时定义一个宏,那你定义的这个宏在什么时候展开呢?

不可能说,你程序在跑的过程中,自己把自己重新编译一下。

所以,你的这种用法,是对宏的误用,脱离了其本意。

C语言中条件编译的作用

你如果讲一个函数声明2次,就会报错。所以把函数声明写在头文件中后,如果引用了2次这个头文件,也会报错。#ifndef #define 宏就是用来避免头文件重复包含的,意思是 如果没有这个定义,就定义下面的内容。

条件编译是为了代码能在不同的环境中都编译通过,通用性更好。

防止重复包含,你完全不用去管它,编译器会搞定的。

条件编译为了提高程序的可移植性,增加程序的灵活性。便于程序在不同的软硬件环境下都可正常运行而不需要修改程序。

比如说一个商业软件,面向的是不同的硬件系统和软件系统,如果移植性不好,那卖出去的软件在每个环境下都要单独设置,那软件公司的开发人员每天都要做这样的修改程序的工作,会影响正常的工作。所以对需要的部分进行条件编译,可以大大降低软件需要改动的部分或者不改动。

C语言中条件编译和If语句之间的别,各适用于什么情况

条件编译是C语言中预处理部分的内容,它是编译器编译代码时处理的部分,

条件编译里面有判断语句,比如

#if

、#else

、#elif

及#endif

它的意思是如果宏条件符合,编译器就编译这段代码,否则,编译器就忽略这段代码而不编译,如

#define

A//把A定义为0

#if

(A

>1)

printf("A

>1");

//编译器没有编译该语句,该语句不生成汇编代码

#elif

(A

==

1)

printf("A

==

1");

//编译器没有编译该语句,该语句不生成汇编代码

#else

printf("A

<1");

//编译器编译了这段代码,且生成了汇编代码,执行该语句

#endif

而if

语句则不然,if

是C

语言中的关键字,它根据表达式的计算结果来觉定执行那个语句,它里面的每个分支都编译了的,

如#define

Aif

(A

>1)

printf("A

>1");

//编译器编译该语句,但因为A

==

未执行

else

if(A

==

1)

printf("A

==

1");

//编译器编译该语句,但因为A

==

未执行

else

printf("A

<1");

//编译器编译该语句,因为A

==

故执行

所以

简单地讲,条件编译是根据

宏条件

选择性地编译语句,它是编译器在编译代码时完成的;

条件语句是根据条件表达式选择性地执行语句,它是在程序运行时进行的。

C语言条件编译程序问题

第8行:error C2014: preprocessor command must start as first nonwhite space

第13行:fatal error C1020: unexpected #endif

第8行,#if CHANGE 要独占一行,即去掉前面的{

第13行 其实报错的原因是,因为第8行没有识别到#if。

在第8行 { 与 #if CHANGE 之间加入回车即可。

同学 出了问题要看报错原因撒。。。

if((c>='A'&&c<='Y')||(c>='a'&&c<='z'))

这里小写字母范围包含‘z’了,马虎了吧。哈哈。

#define CHANGE 1

#if CHANGE

#endif

上面的预处理使用的没有问题。

#include

#define CHANGE 1

int main()

{ char str[20],c;

int i=0;

gets(str);

while((c=str[i])!='0')

{ //这两句是干么的,自己写头文件呀,不能放这里呀#if CHANGE

if((c>='A'&&c<='Y')||(c>='a'&&c<='z'))

c=c+1;

else if((c=='Z')||(c=='z'))

c=c-25;

//同理#endif

printf("%c",c);

i++;

}return 0;

}

第8行去掉#,第13行改为else。

关于C语言中头文件的条件编译的问题

例如,常会将结构体类型的定义放在头文件中(例如FILE结构体,tm结构体等),如果不加条件编译,那么就可能会出现同一个程序中的不同文件由于包含了同一个头文件而导致同一个结构体类型的重复定义,而C中不允许重复定义,所以会出错。

KEIL C是不允许重复定义的,否则会报错,造成编译不过,但是可以使用#include语句将type.h包含进去,也就是说哪里需要此type.h中的结构体,哪里就用#include包含此type.h即可.

为什么C语言头文件中要用条件编译?

如果你说的是文件中避免重复包含的预处理指令,有两个原因

a)重复编译相同的内容,即使不会导致语法错误,对编译器也是极大的开销,在大工程中,是不可容忍的,持续编译集成的代价是很高的,能省必须省

b) 有很多语法元素是不可重复编译的,例如类型定义。你仅仅考虑变量,是远远不够的。实际中,变量在头文件中的使用是非常少的,因为全局变量也是能避免就避免的