我们如何使用#define?
我想知道实例何时将其发送为使用#define和#if语句。我已经了解了一段时间,但从未将其纳入我的编码方式中。这对编译有何影响?
Is #define the only thing that determines if the code is included when compiled? If I have #define DEBUGme as a custom symbol, the only way to exclude it from compile is to remove this #define statement?
解决方案
回答
好吧,定义常用于编译时间常数和宏。因为实际上没有函数调用,所以这可以使代码更快一些,宏的输出值在编译时确定。 #if非常有用。我能想到的最简单的示例是检查调试版本以添加一些额外的日志记录或者消息传递,甚至可能添加一些调试功能。我们还可以通过这种方式检查不同的环境变量。
我相信其他具有更多C / C ++经验的人可以添加更多内容。
回答
我经常发现自己在某些功能中重复定义了一些事情。这样可以使代码更短,从而可以更好地进行概述。
但是,与往常一样,尝试找到一种好的方法,不要以此来创造一种新的语言。对于稍后的偶尔维护,可能会有点难以阅读。
回答
像Bernard的一些示例一样,在C#define
宏中是不允许的。 Cis中#define /#if的唯一常见用法是添加可选的仅调试代码。例如:
static void Main(string[] args) { #if DEBUG //this only compiles if in DEBUG Console.WriteLine("DEBUG") #endif #if !DEBUG //this only compiles if not in DEBUG Console.WriteLine("RELEASE") #endif //This always compiles Console.ReadLine() }
回答
#define用于定义编译时常量,我们可以将其与#if一起使用以包括或者排除某些代码段。
#define USEFOREACH #if USEFOREACH foreach(var item in items) { #else for(int i=0; i < items.Length; ++i) { var item = items[i]; //take item #endif doSomethingWithItem(item); }
回答
@Ed:使用C ++时,在创建宏时使用#define优于内联函数几乎没有任何好处。 "更大速度"的想法是一个误解。使用内联函数,我们可以获得相同的速度,但是我们也可以获得类型安全的信息,并且由于在调用函数之前对参数进行了评估,因此没有预处理器"粘贴"的副作用(例如,尝试编写普遍存在的MAX宏,然后这样称呼它:MAX(x ++,y)..我们会看到我在说什么)。
我从来没有在我的C#中使用#define,而且很少在平台和编译器版本检查C ++中的条件编译时将其用于其他任何用途。
回答
Is #define the only thing that determines if the code is included when compiled? If I have #define DEBUGme as a custom symbol, the only way to exclude it from compile is to remove this #define statement?
我们也可以取消定义符号
#if defined(DEBUG) #undef DEBUG #endif
回答
#define在Cis中最常见的用途可能是区分调试/发行版和不同平台(例如XNA框架中的Windows和X-Box 360)。
回答
它用于条件编译,因此我们可以根据项目属性添加或者删除一些代码,这些属性通常是:
- 目标平台(Windows / Linux / XB360 / PS3 / Iphone ...等)
- 发布或者调试(通常,日志记录,断言等仅包含在调试版本中)
它们还可以用于快速禁用系统的大部分功能,
例如,在游戏开发过程中,我可能会定义
#define PLAYSOUNDS
然后包装最终通话以播放声音:
#ifdef PLAYSOUNDS // Do lots of funk to play a sound return true; #else return true;
因此,对于我来说,打开和关闭声音的播放非常容易。 (通常,调试时我不会播放声音,因为它会妨碍我的个人音乐:))
好处是我们不会通过添加if语句来引入分支。