导航:首页 > 源码编译 > 宏编译开关

宏编译开关

发布时间:2022-01-14 08:20:56

1. #if 及宏定义,是不是C语言里常有这种“开关”用法

#if确实是起到了一个开关作用,但是不同于if语句,if语句只是执行流的变化,最终代码还是被编译了,用#if的话,只有后面为真的情况下才编译,你上面的定义后面需要跟数字,比如
#define USE_Port_B 0
那么相应的代码就不会被编译,说一个简单的情况
#if WINDOWS
//code
#endif
比方说你检查系统的时候,如果是windows的话就定义宏WINDOWS,就是说只有在windows下才会编译code部分

54文人网

2. C语言宏的问题

如果NDEBUG没有定义则#define assert(exp)((void)0)

如果NDEBUG已经定义则向下执行,碰到#ifdef _cplusplus

如果_cplusplus已经定义,则#define assert(exp)(void)((exp)||(_assert(#exp,_FILE_,_LINE_),0))

如果_cplusplus没有定义,则执行:
extern "C"{
#endif
_CRTIMP void _cdecl _assert(void*,void*,unsigned);
#ifdef _cplusplus
}

这种主要用在头文件中,防止头文件的重复调用。

3. EXCEl宏运行编译错误是怎么回事

这是隐藏程序的VBA代码执行出错。解决方法:

1)在Excel中按 Alt+F11 打开宏编辑器;



2)在宏编辑器中按 Ctrl+R 打开 工程资源管理面板(如果已打开,按 Ctrl+R 后不会有任何变化);


3)在工程资源管理面板中找到你的那个文件,点开,检查是否存在“模块n”(n为1、2……),在这些模块上逐个点右键,“移除模块n”。


4)最后保存,即可。

4. 怎么利用宏定义,分别编译Debug版和Release版

乘,卜式未必穷一经。还须黑头

5. 宏替换,宏展开到底分别在什么时候进行

//在宏 使用的时候 分为

宏定义 和 宏展开, 你那个 宏替换就是展开

宏定义是你自己写的 #define
然后展开在预编译时候处理
这个时候编译器先扫描一遍文件 把用到宏的地方都做字符替换

比如
#define M 1

int a = M;
那么预编译的时候就把 M 替换成1

注意宏只做文本替换,所以
比如 #define MUL(__x__, __y__) __x__ * __y__

int a = MUL(a + b, c+ d);
会被替换成 int a = a + b * c + d // 可能就会和初衷违背(如果你想做的是 (a + b) * (c + b))

从展开的角度来说 因为宏是可以嵌套的 所以宏在替换的时候 我们叫做展开

比如 做一个函数参数声明
#define PARAMS_SET_1(__type__, __name__) __type__ __name__
#define PARAMS_SET_2(__type__, __name__) __type__ __name__##1, __type__ __name__##2

//... 定义N个 PARAMS_SET_N
#define PARAMS(__size__, __type__, __name__) PARAMS_SET_##__size__(__type__, __name__)

然后 定义函数

int foo(PARAMS(2, int, n));
那么预编译的时候宏会这样展开

1, int foo(PARAMS_SET_2(int, n));
2, int foo(int n1, int n2);

另外注意就是编程的时候 由于宏只是文本替换,缺少类型检测 以及运算顺序这样的功能,所以要少用宏

上面所有的宏都有替换的方案
#define M 1 替换方案
struct M
{enum {value = 1} };
int a = M::value;

#define MUL(__x__, __y__) __x__ * __y__ 替换方案
template<int x, int y>
struct MUL
{enum{value = x * y}};

int a = MUL<10 + 20, 10 + 30>::value;

最后一个PARAMS的替换方案就是函数重载
template<typename T>
int foo(T n1);

template<typename T>
int foo(T n1, Tn2);

//后面定义N个

6. 什么是宏开关

通常这样的宏叫做宏开关,有很多用处
1.譬如:
注释掉一大段代码,把这段代码用
#if 0 //也可以用#ifdef NONONO,这里的NONONO是随意的,只要没有define过就行,但是#if 0更方便
这里是一大段代码 //这段代码编译的时候就编译不到了
#endif

2.再如:
通常用在头文件中
假如头文件myheader.h

会这样写这个文件

#ifndef __MYHEADER_H__ //注意,是ifndef,表示"假如没有定义",这里的__MYHEADER_H__是任意定的,但通常会使用这样的头文件名的大写字母形式,因为这样可以保证这个宏的名字是唯一的
#define __MYHEADER_H__

void func(void){}

#endif /*__MYHEADER_H__*/ //加上这个注释是比较好的习惯,有始有终,方便阅读

7. c语言中怎么用命令提示窗口编译宏定义并打印出来!请指教.谢谢了.

安装 Visual Studio 后在开始菜单里找 Microsoft Visual C++ 命令提示符,打开后,用微软的编译器 cl 编译,不是 cpp。

8. 制作的宏启用时提示编译错误

ActiveSheet.Pictures , Insert
这里应该不是逗号,应该是点。
ActiveSheet.Pictures.Insert

9. c语言,说宏展开是在编译时进行的,啥意思啥叫编译时进行的

c语言编写出来的代码叫源代码,是供人看的,如果想让机器执行,需要转换成机器语言,这个转换过程就叫编译。
在c语言中定义的宏,在编译时,会展开(或叫替换)为实际的语句,如:
#define MAX 100
void main()
{
int a=MAX ;
printf("a=%d\n", a );
}
这里MAX是个宏,当编译时,这段代码就会变成:
void main()
{
int a=100; //这里的MAX会变成100
printf("a=%d\n", a );
}
这就是宏展开、宏替换,然后编译器,按这样子的源代码进行编译,生成执行程序

10. 如何在VC中编译代码时,通过传入宏开关值得到不同的软件版本

工程的选项中加入你的开关
然后再代码中
#ifdef XXX
#endif

阅读全文

与宏编译开关相关的资料

热点内容
我的世界如何用指令造服务器方熊 浏览:302
鸭题库是哪里的培训机构app 浏览:685
如何对服务器取证 浏览:440
有什么系统像友价源码 浏览:570
圆柱弹簧压缩量 浏览:811
我的世界国际版为什么没法进去服务器 浏览:103
我的世界如何创造一个服务器地址 浏览:837
皮皮虾app怎么玩视频教程 浏览:253
python整型转化字符串 浏览:804
android数据共享方式 浏览:375
编译环境控制台 浏览:620
宁波欣达压缩机空气过滤器价位 浏览:665
幂函数的运算法则总结 浏览:138
方舟自己的服务器怎么搞蓝图 浏览:915
校园网怎么加密ip 浏览:786
kotlin可以编译双端吗 浏览:327
哪个幼儿识字app不要钱 浏览:802
压缩软件的作用 浏览:31
猴子网游app安全吗怎么扫码 浏览:221
哪些系统盘文件夹大 浏览:341