① VC中define定义的宏应该放在头文件还是源文件
定义,为了便于使用可另外在头文件中声明。(理解定义和声明的区别)
函数原型、数据结构、宏根据使用的范围而定,只在一个cpp中使用,就在那个cpp中定义就可以了,否则放到一个公共的头文件中。
类一般在头文件中定义。
另外,虚机团上产品团购,超级便宜
② 头文件中的 ifndef/define/endif 干什么用
#ifndef、#define、#endif为C语言的3条预处理语句,主要用作条件编译。先介绍一下条件编译:
一般情况下,源代码文件中的所有行都参加编译,但有时需要指定一部分代码在某个条件下才被编译,这就叫做条件编译。
条件编译发生在预处理阶段,在C中,主要通过#if、#elif、#else、#ifdef、#ifndef、#endif来给一段代码附加上编译条件,然后预处理器收集满足条件的可以进行编译的代码,这样经过预处理,不满足条件的代码就不会被编译。
这3个预处理语句的功能分别为:
#ifndefsymbol
语句块
#endif
如果没有定义符号symbol,那么就编译下面指定的语句块,用endif来表示条件编译语句的结尾。
#definesymbol
定义一个符号symbol。
这三个预处理语句用在一起可以解决头文件被重复引用的问题:一个.c源程序中可能引用了多个头文件,而被源程序引用的头文件又有可能存在引用关系,比如a.h引用了b.h,然后在源程序中同时引用a.h和b.h,就会产生这个问题,这时编译器会产生符号重定义之类的错误。为了防止该问题,就需要在头文件中加入以下语句:
#ifndefsymbol
#definesymbol
头文件包含的内容
#endif
这样即可防止该头文件被重复引用。symbol一般采取以下方式命名:_头文件名_H,当然也可采取其他方式。
另外,对于有的编译器也可以在头文件中加入#pragma once来防止头文件被重复引用
③ c语言中,头文件define是什么意思。
#开头的都是预处理。define其实就是文本替换,同时可以有简单的逻辑判断。
1、普通情况
#define OK 1
#define rt return
代码里所有的OK都会被替换成1,所有的rt都会被替换成return
2、带括号的情况
#define func(XX) print(XX)
代码里的func会被替换成print 然后XX会对应。
④ 用 #define 定义的一组宏是不是适合放在头文件中
在头文件最上部加
#ifndef XXX
#define XXX
最下部写
#endif
防止重复定义
⑤ 单片机c语言一个头文件中包含许多只有一个标识符的#define,为什么
#define后面只跟一个标识符,表示这个标识符不代表任何值,就是一个空的标识符,常用于作为一个前缀标识,只是为了增加代码的可读性。这样说你可能还不明白,其实这样的用法在很多地方都会出现,比如MFC和Windows SDK头文件中有一个修饰函数参数的#define定义,它的定义是这样的:
#define IN
#define OUT
然后它的用法可能是这样的:
void function(IN LPARAM lParam, OUT WPARAM outparam);
IN和OUT只是修饰,不代表任何东西,所起的只是一个说明作用,说明一个参数是一个输入参数,而另一个是一个输出参数,还能增加代码的可读性。
⑥ 头文件中的ifndef/define/endif什么用处
ifndef和endif是一对条件预编译语句,给你一个例子:
ifndef abc;//意思是如果没有定义abc这个特征符,则编译之后到endif之前的语句否则略过
//define abc;这条语句;
define abc;
endif;
比如有一段代码,有时需要根据需要不进行编译或进行编译,如以下代码:
ifdef abc;
某段代码;
endif;
意思就是如果程序中定义了abc特征符,则编译这里所说的"某段代码”,否则不进行编译,
如果程序是这样:
ifndef abc;
define abc;
endif;
ifdef abc;
某段代码;
endif;
则这里所说的“某段代码”肯定会被编译,因为在设计程序之初,可能需要根据某个条件来决定是否编译“某段代码”,但是后来发现,这样的条件编译已经没有必要,而且必须要编译“某段代码”,两种办法,一种是把ifdef abc和endif;去掉;另一种就像这里一样,在
ifdef abc;
某段代码;
endif;
之前加
ifndef abc;
define abc;
endif;