日期:2014-05-17  浏览次数:20996 次

#if !NETCF什么意思?
看log4net的代码,发现其中有很多类似如下的代码:

#if DEBUG
#if !SSCLI
#if NET_2_0
#if NET_4_0
#if NETCF_1_0
#if !MONO 
#if !NETCF && !SSCLI && !CLIENT_PROFILE
#if !CLI_1_0
#if CONFIRM_WIN32_FILE_SHAREMODES
#if CLIENT_PROFILE
#if RESIZABLE_CYCLIC_BUFFER
#if HAS_READERWRITERLOCK
#if HAS_READERWRITERLOCKSLIM

对条件编译不太懂,有没有解释下都是什么意思?或者给个文档解释的链接地址,我自己去看。
谢谢。

------解决方案--------------------
引用:
Quote: 引用:

绝对不是的。我说了,也可以在项目属性中定义(其实就是在编译的时候传给编译器)
在源代码中定义的,对源代码有效(除非遇到#undef),在项目属性中定义的,对项目有效。

http://msdn.microsoft.com/zh-cn/library/0feaad6z.aspx
/define 选项将 name 定义为程序的所有源代码文件中的一个符号。 

恩,第二个问题
【我在log4net的ReaderWriterLock.cs中找到了#define HAS_READERWRITERLOCK,那么这个HAS_READERWRITERLOCK只对ReaderWriterLock.cs有效还是整个项目有效?】
答案是:我在log4net的ReaderWriterLock.cs中找到了#define HAS_READERWRITERLOC,它只对ReaderWriterLock.cs有效。

还有一个问题:
NET_2_0 CLIENT_PROFILE 等到底是在哪里定义的?
如果是微软定义在.net framework中的,那么一定会有一个列表的api;
如果不是,我在log4net的代码中搜索不出来。是为什么呢?


项目属性啊。我说了多次了。
------解决方案--------------------
C# 好像没有任何预定义任何Conditional compilation symbol
------解决方案--------------------
楼主钻牛角尖了,那个是条件编译,也就是说,写代码的时候把所有条件对应的代码都写上去,但是实际项目编译的时候只有满足条件的部分而不是全部代码才会参与编译,如果你找不到对应的名称定义,那就代表了那部分#if作用范围内部的代码都不会参与编译,实际也你可以看到Visual Studio里面那部分代码是灰色的,不起作用。那么何时起作用?只要你自己在项目属性里面把#if 后面的条件编译符号填写进去,那部分代码就生效了,但是最好别自己乱改,你不清楚它的逻辑的情况下,随便修改条件编译符号可能会让代码冲突。
例如:
#if CSHARP30  
            public IEnumerable<TReturn> Read<TFirst, TSecond, TThird, TFourth, TReturn>(Func<TFirst, TSecond, TThird, TFourth, TReturn> func, string splitOn)
#else
            public IEnumerable<TReturn> Read<TFirst, TSecond, TThird, TFourth, TReturn>(Func<TFirst, TSecond, TThird, TFourth, TReturn> func, string splitOn = "id")
#endif
            {
                return MultiReadInternal<TFirst, TSecond, TThird, TFourth, DontMap, TReturn>(func, splitOn);
            }

这是我自己写的代码,意思是如果定义了条件编译符号CSHARP30,