Директивы препроцессора C # - PullRequest
2 голосов
/ 24 мая 2011

В 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 или что у вас, не знаю, что делать.

Ответы [ 3 ]

4 голосов
/ 24 мая 2011

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

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

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

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

2 голосов
/ 24 мая 2011

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

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

2 голосов
/ 24 мая 2011

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

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

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

...