游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3309|回复: 9

编成初级学员向大家请教个问题

[复制链接]

10

主题

24

帖子

24

积分

注册会员

Rank: 2

积分
24
发表于 2008-3-19 14:20:00 | 显示全部楼层 |阅读模式
网上的一篇资料
C++/C程序的头文件以“.h”为后缀。以下是假设名称为 graphics.h的头文件:
#ifndef GRAPHICS_H (作用:防止graphics.h被重复引用)  

问题:这里为什么是GRAPHICS_H,而不是 graphics.h,GRAPHICS_H和graphics.h怎么建立联系

#define GRAPHICS_H
#include.... (作用:引用标准库的头文件)
...
#include... (作用:引用非标准库的头文件)
...
void Function1(...); (作用:全局函数声明)
...
class Box (作用:类结构声明)
{
...
};
#endif
abc

16

主题

280

帖子

280

积分

中级会员

Rank: 3Rank: 3

积分
280
QQ
发表于 2008-3-19 18:06:00 | 显示全部楼层

Re: 编成初级学员向大家请教个问题

GRAPHICS_H和graphics.h没啥关系 [em21]

0

主题

22

帖子

43

积分

注册会员

Rank: 2

积分
43
发表于 2008-3-19 18:26:00 | 显示全部楼层

Re:编成初级学员向大家请教个问题

没关系的啊。
GRAPHICS_H是你自己起的名字,你想叫什么都可以。
叫成GRAPHICS_H是为了便于区分。

10

主题

24

帖子

24

积分

注册会员

Rank: 2

积分
24
 楼主| 发表于 2008-3-20 07:34:00 | 显示全部楼层

Re: 编成初级学员向大家请教个问题

有点糊涂,GRAPHICS_H和graphics.h没有关系,那怎么知道graphics.h到底有没有被重复定义

10

主题

24

帖子

24

积分

注册会员

Rank: 2

积分
24
 楼主| 发表于 2008-3-20 08:23:00 | 显示全部楼层

Re: 编成初级学员向大家请教个问题

也就是想知道为什么通过GRAPHICS_H真假的判断,就能知道graphics.h的内容是否被重复定义

60

主题

1319

帖子

1319

积分

金牌会员

Rank: 6Rank: 6

积分
1319
发表于 2008-3-20 08:34:00 | 显示全部楼层

Re:编成初级学员向大家请教个问题

如果你愿意,也可以写成
#ifndef _ABCDEFG_GFEDCBA__
#define _ABCDEFG_GFEDCBA__


#endif

如果你只想在VC里用,上面的这些也可以不写,在文件开头写上
#pragma once
就行了

16

主题

280

帖子

280

积分

中级会员

Rank: 3Rank: 3

积分
280
QQ
发表于 2008-3-21 10:06:00 | 显示全部楼层

Re: Re:编成初级学员向大家请教个问题

ljm: Re:编成初级学员向大家请教个问题

#pragma once

原来还能这样用  [em13]

16

主题

280

帖子

280

积分

中级会员

Rank: 3Rank: 3

积分
280
QQ
发表于 2008-3-21 10:11:00 | 显示全部楼层

Re: Re: 编成初级学员向大家请教个问题

lanniao2004: Re: 编成初级学员向大家请教个问题

也就是想知道为什么通过GRAPHICS_H真假的判断,就能知道graphics.h的内容是否被重复定义

翻一下语言书就可以了

16

主题

280

帖子

280

积分

中级会员

Rank: 3Rank: 3

积分
280
QQ
发表于 2008-3-21 10:14:00 | 显示全部楼层

Re:编成初级学员向大家请教个问题

这是从编程爱好者中的“C语言初学者入门讲座”中的一个内容,非常简单:条件编译,避免在一个文件中重复包含另一文件

条件编译

  预处理程序提供了条件编译的功能。 可以按不同的条件去编译不同的程序部分,因而产生不同的目标代码文件。 这对于程序的移植和调试是很有用的。 条件编译有三种形式,下面分别介绍:

  1. 第一种形式:

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

  它的功能是,如果标识符已被 #define命令定义过则对程序段1进行编译;否则对程序段2进行编译。如果没有程序段2(它为空),本格式中的#else可以没有, 即可以写为:

#ifdef 标识符
程序段 #endif
#define NUM ok
main(){
 struct stu
 {
  int num;
  char *name;
  char sex;
  float score;
 } *ps;
 ps=(struct stu*)malloc(sizeof(struct stu));
 ps->num=102;
 ps->name="Zhang ping";
 ps->sex='M';
 ps->score=62.5;
 #ifdef NUM
  printf("Number=%d\nScore=%f\n",ps->num,ps->score);
 #else
  printf("Name=%s\nSex=%c\n",ps->name,ps->sex);
 #endif
 free(ps);
}  

  由于在程序的第16行插入了条件编译预处理命令, 因此要根据NUM是否被定义过来决定编译那一个printf语句。而在程序的第一行已对NUM作过宏定义,因此应对第一个printf语句作编译故运行结果是输出了学号和成绩。在程序的第一行宏定义中,定义NUM表示字符串OK,其实也可以为任何字符串,甚至不给出任何字符串,写为: #define NUM 也具有同样的意义。 只有取消程序的第一行才会去编译第二个printf语句。读者可上机试作。

  2. 第二种形式:

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

  与第一种形式的区别是将“ifdef”改为“ifndef”。它的功能是,如果标识符未被#define命令定义过则对程序段1进行编译, 否则对程序段2进行编译。这与第一种形式的功能正相反。

  3. 第三种形式:

#if 常量表达式
程序段1
#else
程序段2
#endif  

  它的功能是,如常量表达式的值为真(非0),则对程序段1 进行编译,否则对程序段2进行编译。因此可以使程序在不同条件下,完成不同的功能

#define R 1
main(){
 float c,r,s;
 printf ("input a number: ");
 scanf("%f",&c);
 #if R
  r=3.14159*c*c;
  printf("area of round is: %f\n",r);
 #else
  s=c*c;
  printf("area of square is: %f\n",s);
 #endif
}

  本例中采用了第三种形式的条件编译。在程序第一行宏定义中,定义R为1,因此在条件编译时,常量表达式的值为真, 故计算并输出圆面积。上面介绍的条件编译当然也可以用条件语句来实现。 但是用条件语句将会对整个源程序进行编译,生成的目标代码程序很长,而采用条件编译,则根据条件只编译其中的程序段1或程序段2, 生成的目标程序较短。如果条件选择的程序段很长, 采用条件编译的方法是十分必要的。

10

主题

24

帖子

24

积分

注册会员

Rank: 2

积分
24
 楼主| 发表于 2008-3-26 10:38:00 | 显示全部楼层

Re:编成初级学员向大家请教个问题

有点明白了,谢谢大家
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-20 15:47

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表