Директивы препроцессора C #

В C ++ мы можем сделать это:

struct {
#if defined (BIGENDIAN)
        uint32_t h;
        uint32_t l;
#else
        uint32_t l;
        uint32_t h;
#endif
    } dw;

Теперь в C # не все так просто. У меня есть метод для тестирования BigEndian, но чтобы определить структуру во время компиляции, как мы можем получить тот же эффект в C #? Я думал, что могу иметь классы вроде BoardBig и BoardLittle и использовать фабрику для получения нужного мне класса на основе проверки IsBigEndian. А для проверок _WIN64 у меня могут быть такие классы, как «Position_64» и «Position_32», что-то в этом роде. Это хороший подход? Поскольку C # не может определять такие операторы, как #define IsBigEndian 1 или что-то еще, не знаю, что делать.


person David    schedule 24.05.2011    source источник


Ответы (3)


Обновление. И, как указывали (проголосовали за) другие авторы, это не решение проблемы байтов в C #.

C # директивы условной компиляции

  #if BIGENDIAN
      uint32_t h;    
      uint32_t l;
  #else
      uint32_t l;
      uint32_t h;        
  #endif

Кстати, вам следует избегать этого, если вы можете. Делает код труднее тестировать.

person Mitch Wheat    schedule 24.05.2011
comment
Вы связались с документацией по JScript. Вот версия C #: msdn.microsoft.com/en-us/library/aa691095 .aspx - person porges; 24.05.2011

Поскольку вы не можете «отобразить память» структур C # на необработанные данные, нет никакого реального преимущества в использовании препроцессора для этой цели. Поэтому, хотя в C # есть функции препроцессора, которые можно использовать для других целей, я не думаю, что они будут вам полезны здесь.

Вместо этого просто поработайте с одной предпочтительной структурой и похороните низкоуровневое вращение битов для особых случаев. Вот пример обработки с прямым порядком байтов и прямым порядком байтов для структуры:

person Rick Sladkey    schedule 24.05.2011
comment
Кажется, довольно интересное чтение. Я посмотрю. Большое спасибо - person David; 24.05.2011

В C # есть условная компиляция, но вы не можете использовать ее для получения другого кода в зависимости от порядка байтов. Для управляемых языков порядок байтов системы неизвестен во время компиляции.

Компилятор создает код IL, который может выполняться как в системах с прямым порядком, так и в системах с прямым порядком байтов. Это JIT-компилятор, который заботится о превращении кода IL в машинный код и превращает числовые литералы в правильный формат.

Вы можете использовать BitConverter.IsLittleEndian, чтобы узнать порядок байтов во время выполнения .

person Guffa    schedule 24.05.2011
comment
добавлена ​​ссылка на BitConverter.IsLittleEndian - person Mitch Wheat; 24.05.2011