C#中是否有类似于#include的#def常量等效方式?

3
在人们批判这个问题之前,我想解释一下我的目的。
我现在有一个可以访问共享内存的C程序。该C程序通过#defined偏移量来导航此共享内存。例如:
#define VAR_1 0x2000

现在我有一个C#程序,可以显示来自共享内存的数据。我正在尝试确定如何使用我的C程序使用的#define,并让我的C#程序也引用它们。
我正在尝试避免需要维护包含这些定义的两个文件。
因此,是否有任何方法让C#程序使用.h文件中的#define?
谢谢。

1
C和C#程序是否可以在运行时加载偏移量?如果可以的话,将其放入配置文件中并在运行时加载。 - Federico klez Culloca
请参阅 MSDN:https://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/preprocessor-directives/preprocessor-if - jdweng
使用C++/CLI很容易实现,但使用C#则不太方便。除了配置文件外,您可以考虑将这些偏移量写入MMF,在视图的开头处放置在一个众所周知的位置(如0)。这正是共享内存的重点 :) - Hans Passant
2
由于您拥有C项目的源代码,最简单的方法是使用T4模板从h文件生成cs文件,例如带有常量的静态类。您只需要编写一次T4并仅维护头文件即可。 - Sinatr
1
编写一个 C# 的 .h 文件解析器,将其包含在你的 C# 项目中,并将 .h 文件用作配置文件。 - Eric Lippert
1个回答

1

简短的回答是不可以:

#define指令不能像在C和C++中一样用于声明常量值。在C#中,最好将常量定义为类或结构体的静态成员。如果您有多个这样的常量,请考虑创建一个单独的“Constants”类来保存它们。

您可以像这样做:

constants.cs:

#if __STDC__
#define public
#else
namespace foo
{
    class Constants {
#endif

public const int VAR_1 = 0x2000;

#if __STDC__
#undef public
#else
    }
}
#endif

main.c:

#include <stdio.h>
#include "constants.cs"

int main(void)
{
    printf("%d\n", VAR_1);
    return 0;
}

Program.cs:

using System;
namespace foo
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(Constants.VAR_1);
        }
    }
}

这将导致:
$ gcc -Wall -Wpedantic main.c && ./a.out 
8192
$ dotnet run
8192

这里使用C语言中的const int代替#define,但这可能是一种你愿意做出的权衡。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接