宏编译开关
A. EXCEl宏运行编译错误是怎么回事
这是隐藏程序的VBA代码执行出错。解决方法:
1)在Excel中按 Alt+F11 打开宏编辑器;
2)在宏编辑器中按 Ctrl+R 打开 工程资源管理面板(如果已打开,按 Ctrl+R 后不会有任何变化);
3)在工程资源管理面板中找到你的那个文件,点开,检查是否存在“模块n”(n为1、2……),在这些模块上逐个点右键,“移除模块n”。
4)最后保存,即可。
B. 什么是宏开关
通常这样的宏叫做宏开关,有很多用处
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__*/ //加上这个注释是比较好的习惯,有始有终,方便阅读
C. #if 及宏定义,是不是c语言里常有这种“开关”用法
#if确实是起到了一个开关作用,但是不同于if语句,if语句只是执行流的变化,最终代码还是被编译了,用#if的话,只有后面为真的情况下才编译,你上面的定义后面需要跟数字,比如
#define USE_Port_B 0
那么相应的代码就不会被编译,说一个简单的情况
#if WINDOWS
//code
#endif
比方说你检查系统的时候,如果是windows的话就定义宏WINDOWS,就是说只有在windows下才会编译code部分
54文人网
D. 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
}
这种主要用在头文件中,防止头文件的重复调用。
E. c语言中怎么用命令提示窗口编译宏定义并打印出来!请指教.谢谢了.
安装 Visual Studio 后在开始菜单里找 Microsoft Visual C++ 命令提示符,打开后,用微软的编译器 cl 编译,不是 cpp。
F. 制作的宏启用时提示编译错误
ActiveSheet.Pictures , Insert
这里应该不是逗号,应该是点。
ActiveSheet.Pictures.Insert
G. 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 );
}
这就是宏展开、宏替换,然后编译器,按这样子的源代码进行编译,生成执行程序
H. 如何在VC中编译代码时,通过传入宏开关值得到不同的软件版本
工程的选项中加入你的开关
然后再代码中
#ifdef XXX
#endif
I. 怎么利用宏定义,分别编译Debug版和Release版
乘,卜式未必穷一经。还须黑头
J. 宏替换,宏展开到底分别在什么时候进行
//在宏 使用的时候 分为
宏定义 和 宏展开, 你那个 宏替换就是展开
宏定义是你自己写的 #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个