我想知道是否有办法在运行时设置#define的值。有没有办法在运行时设置#define的值?
我假设在下面的代码中存在针对Oracle特定和Sql Server特定的查询。
#define oracle
// ...
#if oracle
// some code
#else
// some different code.
#endif
我想知道是否有办法在运行时设置#define的值。有没有办法在运行时设置#define的值?
我假设在下面的代码中存在针对Oracle特定和Sql Server特定的查询。
#define oracle
// ...
#if oracle
// some code
#else
// some different code.
#endif
绝对不是,#define语句由预处理器编译出的编译器,甚至看到它之前 - 这样的令牌“甲骨文”甚至不是在你的代码,只是“1”或“0”。将#define更改为全局变量或(更好)返回正确值的函数。
#if
是编译时。你可以在你的构建过程中指定它(通过切换到msbuild/csc),但不是在运行时。排除代码不存在。你可能会得到更好的建议(1):
没有,预处理程序运行前进行编译,可以在那个时候修改代码,这是它的目的,如果你想在运行时根据什么来切换行为使用一个变量和正常条件逻辑。
您的设计是错误的。绝对错误。这在20年前可能是可以接受的,但是在这里做你需要的东西有很多更好的技术。
您需要将所有数据访问逻辑分解为不依赖于实际实现(基于SQL或基于Oracle)的接口,然后使用DI/IoC在运行时注入所需的实现。它比听起来简单得多,工作极其出色,使您的代码易于测试,并允许您自定义和更新应用程序,而无需执行完整的重新安装。
相关问题:
https://stackoverflow.com/questions/45191/ioc-explain-and-more-important-when-to-use-it
Inversion of Control with .net
https://stackoverflow.com/questions/71041/which-single-iocdi-container-would-you-recommend-using-and-why
当然,存在更好的解决方案。也许这就是我问这个问题的原因。而且我还表示这是一个“假设”。即使存在,我也不会以这种方式使用解决方案。这个例子只是一个例子,以了解是否存在某种方式! – 2008-11-10 15:51:37