C# 在C中使用#ifdef的问题# 我有C++代码,使用这种方法: #if defined(CONSTANT) .. // Some code #else // Some other code 我被告知我可以在C语言中使用类似的方法,因为我需要把这个C++项目重写到C。 但有一个问题。从文档中我看到,如果我使用
这仅在声明它的文件中可见 但我不想要这个。我想让这个C# 在C中使用#ifdef的问题# 我有C++代码,使用这种方法: #if defined(CONSTANT) .. // Some code #else // Some other code 我被告知我可以在C语言中使用类似的方法,因为我需要把这个C++项目重写到C。 但有一个问题。从文档中我看到,如果我使用,c#,c++,dll,C#,C++,Dll,这仅在声明它的文件中可见 但我不想要这个。我想让这个常量在所有类中都可见? 我认为一种解决方案是在项目设置等中声明此类常量,但这里是我的第一个问题:在这种情况下,我是否需要在DLL中附带一些额外的文件?或者这些常量将嵌入DLL? 最后,为了避免上述问题,我正在考虑在C#中只使用公共常量值的方法。像 然后根据配置,我将在声明Globals.SomeConstant时设置默认值,将其设置为我需要的值,编译DLL并发布。这听起来好吗?它会像这样工作吗?默认值是否会在DLL方法中正确分配和读取?(它们会
常量在所有类中都可见?
我认为一种解决方案是在项目设置等中声明此类常量,但这里是我的第一个问题:在这种情况下,我是否需要在DLL中附带一些额外的文件?或者这些常量将嵌入DLL?
最后,为了避免上述问题,我正在考虑在C#中只使用公共常量值的方法。像
然后根据配置,我将在声明Globals.SomeConstant
时设置默认值,将其设置为我需要的值,编译DLL并发布。这听起来好吗?它会像这样工作吗?默认值是否会在DLL方法中正确分配和读取?(它们会像35;ifdefs那样工作吗?
?)
我知道我需要重新编译来更改代码,但这没关系。C#没有与C/C++相同的“预处理器”。这些#define
也不是“常量”——它们只是“符号”,您只能查询是否存在。它们不会在已编译的程序集中留下任何痕迹
现在,当您使用(或不使用)一个#define
d符号编译程序集时,结果可能会非常不同:
public const int I =
#if FOO_BAR
42
#else
43
#endif
;
C/C++和C#在概念上的区别在于,C/C++中的库通常以源代码形式分发,当与您自己的代码一起编译时,遵循全局\define
s。另一方面,在C#中,第三方代码通常作为编译程序集分发。因此,如果要更改此第三方程序集中的代码的工作方式,则必须在运行时执行此操作。如果使用Visual Studio,则执行预处理器指令非常简单
选择项目
性质
建造
在“条件编译符号”上放置所需的符号,您应该可以访问所有程序集
如果您不使用VisualStudio,只需遵循以下步骤
为了了解预处理器指令,您可以访问网站
<>使用C++方法编写C语言中的代码,可以使用以下语法:
#define Name_Value
#if (Name_value)
{
//code
}
如果这不符合您的需要,您可以使用一个配置文件,在该文件中,您可以堆叠所有密钥名称-值,并通过configurationmanager.AppSettings[“key”]
另一种解决方法是使用全局enum
并赋值
public enum DemoEnum
{
Name = Value
}
if(passedEnum == DemoEnum.Name)
{
// code
}
使用常量给出的解决方案不是很灵活,因为如果代码发生更改,则必须创建新的常量,并且图像会变得太模糊
使用只读属性,您可以在方法中切换“const”的值
public class Global
{
public readonly string Name;
public Global()
{
if(condition)
Name = 10;
else
Name = 30;
}
}
如果我忘记了一个选项,请随意评论:)您可以在该项目的项目属性中定义全局定义。属性>构建>条件编译符号那里定义的符号不会被嵌入,编译后的代码将在编译器中遵循不同的路径,编译符号是“编译时”的东西,而不是运行时。您发布的第二种方法并不等同于#ifdef
,我会避免这种方法。它们只是编译时常量,不会嵌入到您的DLL中。@RonBeyer:我的观点是,如果我像您提到的那样在项目属性中定义这些常量,我是否需要随DLL附带任何其他内容?或者我的DLL就可以了?根据我在属性中定义的符号,我可以适当地使用#ifdef,那么,DLL将是您需要发送的全部内容,根据是否定义了符号,代码的编译方式将有所不同。这是对符号的恰当使用,用于定义仅在定义符号时才编译的代码。@RonBeyer:好的,那么我应该检查属性->构建等?公共常量方法有什么问题“你给出的常量解决方案不是很灵活,因为如果你的代码发生变化,你将不得不创建新的常量,并且图像变得太模糊。”-你能解释一下你在这里的意思吗?我在考虑公共密码,因为如果需要重新编译,这不是问题,因为当前C++解决方案也会这样工作。您认为呢?我被告知“请注意:不能保证您的解决方案中的所有项目的条件编译符号都相同。这将阻碍其他需要不同条件编译符号的解决方案重用DLL。”-你知道这是什么意思吗?我指的是全局常量枚举basically@user300224全局枚举的工作方式就像一个符咒,但正如您在问题中指出的那样,如果(Globals.SomeConstant==SOMEVALUE)//执行其他操作//执行smth elseBodgan:是,请参见此处public const DppConfiguration configuration=DppConfiguration.SOFTWARE\u HSM代码>-DppConfiguration
-是一个枚举。我在声明中给出了一些初始值,你们可以看到。即使在DLL中,它也能正常工作吗?请对此发表评论。“另一方面,在C#中,第三方代码通常作为编译程序集分发。因此,如果您想更改此第三方程序集中的代码的工作方式,您必须在运行时执行此操作。”--您能解释一下您在这里的意思吗?
public enum DemoEnum
{
Name = Value
}
if(passedEnum == DemoEnum.Name)
{
// code
}
public class Global
{
public readonly string Name;
public Global()
{
if(condition)
Name = 10;
else
Name = 30;
}
}