2017-09-13 21 views
2

在人們拆開這個問題之前,我會解釋我正在嘗試做什麼。C#提供了#def常量的#include等價物嗎?

我目前有一個C程序可以訪問共享內存。 C程序通過#defined偏移量導航這個共享內存。例如:

#define VAR_1 0x2000 

現在我有一個C#程序,顯示來自該共享內存的數據。我試圖確定如何使用我的C程序使用的#define,並讓我的C#程序也引用它們。

我試圖避免需要維護兩個包含這些定義的文件。

因此,有沒有辦法讓C#程序使用.h文件中的#define?

謝謝,

+1

C和C#程序可能在運行時加載偏移量嗎?如果是這樣,請將其放入配置文件並在運行時加載它。 –

+0

查看msdn:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/preprocessor-directives/preprocessor-if – jdweng

+0

使用C++/CLI很容易,而不是使用C#。除了一個配置文件之外,你可以考慮在一個衆所周知的位置(如0)的視圖的開始位置在MMF中寫入這些偏移量。有點共享內存:) –

回答

1

The short answer is no

#define指令不能被用作 聲明常數值C和C通常完成++。 C#中的常量最好定義爲 類或結構的靜態成員。如果您有幾個這樣的常量,請考慮創建一個單獨的「常量」類來保存它們的 。

你可以做這樣的事情:

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 

這是使用const int,而不是#define在C,但可能是你願意做一個權衡。