Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中使用#ifdef的问题# 我有C++代码,使用这种方法: #if defined(CONSTANT) .. // Some code #else // Some other code 我被告知我可以在C语言中使用类似的方法,因为我需要把这个C++项目重写到C。 但有一个问题。从文档中我看到,如果我使用_C#_C++_Dll - Fatal编程技术网

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;
        }
    }