2009-07-30 44 views
4

我在C++中有一個包含常量定義的文件,我想在C#項目中使用相同的定義。由於這兩個項目都是更大項目的一部分,我希望如果C++文件中有更改(添加/刪除),它也應該反映在相應的C#文件中。我想保持2個文件同步。我想知道是否有一個腳本/工具來做到這一點。將簡單的C++代碼自動轉換爲C#

反向解決方案(C# - > C++)也可以工作。

澄清:

目前的代碼是:

//C++ 
    struct Colors{ 
     static const int Red = 100; //Custom Values are important 
     static const int Green = 101; } 
//C# 

public enum Color{ Red = 100; Green =101; } 

現在,我希望有一個單一的文件,以便在C++中都體現在C#(或周圍其他方式)的任何變化,這樣我可以在這些常量的項目中有一個文件。

如您所見,我想將C++中一個結構體中定義的常量映射爲C#中的枚舉。我想對上面預期的定義沒有/很小的變化,因爲在上述結構中有其他代碼依賴於(在兩個項目中)(但是可能會這樣做,如果沒有以當前格式完成此操作的好方法)

+0

什麼樣的常量?最重要的是,涉及哪些數據類型?短樣本片段也很方便。 – 2009-07-30 21:58:01

+0

你問過很棒!當前的代碼是: // C++ struct Colors {static int int Red = 100; //自定義值很重要 static const int Green = 101; } 從以上我想要在C#中: public enum Color { Red = 100; 綠色= 101; } 如您所見,我想將C++中一個結構體中定義的常量映射爲C#中的枚舉。我想對上面預期的定義沒有/很小的變化,因爲在上述結構中有其他代碼依賴(在兩個項目中)(但是可能會這樣做,如果沒有以當前格式完成此操作的好方法) – 2009-07-30 23:12:21

回答

1

您可能不會找到腳本...您應該有自己的腳本來執行此操作。否則MACRO是最合適的......
如果你有一個腳本,那麼你可以在你的makefile中創建一個規則,當你建立你的項目時它會自動運行這個腳本。

4

爲什麼不把常量文件作爲像App.Constants.dll這樣的程序集單獨打包,並讓C#和C++項目都引用它們?這樣,你可以在一個地方做出改變。在Visual Studio中有基於項目的參考。

+0

這會需要使用託管C++(根本不是真正的C++),當然? – bdonlan 2009-07-30 21:48:41

+0

@bdonlan我相信你也可以使用非託管的C++。你確定? – 2009-07-30 21:56:27

1

假設使用純整數常量等,應該有可能通過創造性地使用預處理器來重用相同的源文件。事情是這樣的:

#if CSHARP 
public class Constants { 
#else 
# define public 
#endif 

// Easy stuff 
public const int FOO = 1; 
public const int BAR = 2; 

// Enums can be done too, but you have to handle the comma 
public enum Color { COLOR_RED, COLOR_GREEN, COLOR_BLUE } 
#if !CSHARP 
; 
#endif 

#if CSHARP 
} 
#else 
# undef public 
#endif 

您可能需要對某些類型的類型定義,使他們的名字相匹配(例如typedef unsigned int uint)。

然後,將代碼作爲C#項目的一部分編譯爲/define:CSHARP,還將其編譯爲某個C++頭文件,但不添加其他定義。

1

你想要做的是創建一個託管C++庫,其中包含常量和枚舉,格式可以在非託管C++和C#中重用。

託管版本:

//managed.cpp 
#define MAKECONST(name, value) public const int ##name = ##value; 

public enum class FruitType 
{ 
    #include "FruitType.h" 
}; 

pubilc ref class Constants { 
    #include "const.h" 
}; 

非託管版本:

//unmanaged.cpp 
#define MAKECONST(name, value) const int ##name = ##value; 

enum FruitType 
{ 
    #include "FruitType.h" 
}; 

#include "const.h" 

實際枚舉定義:

//FruitType.h 
Apple = 1, 
Banana, 
Lychee 

的consts文件:

​​
0

這樣做的自動方法是使用SWIG將C++代碼轉換爲C#。