Sas*_*sha 7 c# conditional-compilation c-preprocessor
在C#中#define指令的目的和用法是什么?
关于这个主题的问题已经很少了,但我没有答案.他们只举例说明它的工作原理.但我需要更深入的解释:它为什么存在以及使用它的好方法(如果有的话).
基本上我知道如何使用它,但对我来说,用法看起来很奇怪.我们来看看例子:
#define DEV
#if DEV
Console.WriteLine("Development trace log message");
#endif
Run Code Online (Sandbox Code Playgroud)
对我来说,这与使用项目定义的条件编译符号的#if条件构建完全不同.如果我们使用项目定义的符号,它将附加到项目构建配置,我们可以使用构建配置来管理构建(并从构建中排除)所需的代码.所以代码
#if DEBUG
Console.WriteLine("Debug log message");
#endif
Run Code Online (Sandbox Code Playgroud)
对我来说没问题.但正如我所说,它与使用#define指令完全不同,因为它是可管理的. 我是否正确,第一个示例只能在每次构建时手动注释/取消注释#define行?如果是的话,它是不可管理的,难以维护的,我认为#define的这种用法是极其不好的做法,并且根本不存在于语言中.
我可以想象在#if语句中使用#define/#undef.就像是
#if DEBUG
#if CLIENT1
#define TEST_CLIENT1
#endif
#endif
#if TEST_CLIENT1
connectionString = "Some specific test connection" //I know this is bad practice even in conditional. Only for example purpose.
#elif
//Read connection from config
#endif
#if UNITTESTS
#undef TEST_CLIENT1
#endif
#if TEST_CLIENT1
Console.WriteLine("Some message");
#endif
Run Code Online (Sandbox Code Playgroud)
很抱歉这么复杂的例子,但这至少是我觉得有用的东西.虽然我不会以任何方式编写这样的代码=). #define有什么用处吗?
PS:我自己从未使用#define 5年并且没有意愿去做,但是我得到了一个支持项目,它有很多奇怪的定义,甚至以奇怪的方式命名.这些定义通常放在文件的顶部,就像我在这里的第一个例子.我不知道如何维护这段代码.
小智 1
“#define”之所以存在,是因为人们期望它存在。:) 出于您的目的(例如大型项目),在项目中保留预处理器符号可能更有意义。对于快速调试或其他目的#define 可能是最好的选择。此外,#define 允许对符号进行细粒度(文件级)控制。
想象一下,您有一个庞大的代码库和一个给您带来麻烦的模块。出于性能原因,您可能希望仅在要启用跟踪/调试的单个文件中使用“#define TRACE”或“#define DEBUG”。