سؤال

ولدي ملف في C ++ التي تحتوي على تعريفات ثابتة، أريد أن استخدام نفس التعاريف في C # المشروع. منذ كلا المشروعين هي جزء من مشروع أكبر، أريد إذا كان هناك تغيير (إضافة / حذف) في C ++ تودعه يجب ان تحصل على تنعكس في المقابلة C # ملف أيضا. أريد أن تبقي الملفات 2 متزامنة. كنت أتساءل إذا كان هناك برنامج نصي / أداة للقيام بذلك.

والحل العكسي (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 #. أريد أن رقم / تغيرات طفيفة في تعريفات المتوقع أعلاه، وهناك قانون آخر يعتمد (في كلا المشروعين) على الهياكل المذكورة أعلاه (ولكن قد تفعل ذلك، إذا ليس هناك وسيلة جيدة لتحقيق هذا في الشكل الحالي)

هل كانت مفيدة؟

المحلول

وربما كنت لن تجد السيناريو ... هل ينبغي أن يكون السيناريو الخاص بك للقيام بذلك. على خلاف ذلك وحدات الماكرو هي الأنسب ...
إذا كان لديك برنامج نصي ثم يمكنك إنشاء قاعدة في MAKEFILE من شأنها أن تلقائيا تشغيل هذا البرنامج النصي كلما إنشاء المشروع.

نصائح أخرى

لماذا لا تأخذ الثوابت الملف وحزمه منفصل باعتبارها شيئا التجمع مثل App.Constants.dll ويكون كل من C # و ج ++ المشاريع مرجع لهم؟ بهذه الطريقة، يمكنك إجراء تغيير في مكان واحد. والمشروع الذي يقوم المراجع لتجعل من السهل في Visual Studio.

وعلى افتراض الثوابت عدد صحيح واضحة وبالتالي، ينبغي أن يكون من الممكن إعادة استخدام نفس الملف المصدر باستخدام المعالج خلاق. شيء من هذا القبيل:

#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

وقد تحتاج typedefs لبعض أنواع بحيث تطابق أسماءهم (مثل typedef unsigned int uint).

وبعد ذلك قمت ترجمة التعليمات البرمجية الخاصة بك كجزء من مشروع # C مع /define:CSHARP، وأيضا #include أنه في بعض رأس C ++ مع أي يعرف إضافية.

وما تريد القيام به هو إنشاء مكتبة تمكن 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:

//consts.h
MAKECONST(NumFruitInABowl, 3)
MAKECONST(NumBowls, 2)

وطريقة تلقائية للقيام بذلك لاستخدام إكرع لتحويل الشفرة C ++ إلى C #.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top