EmpireWorld Ответов: 1

Как использовать #define внутри #if?


Мне нужно было определить директиву препроцессора, которая абстрагирует некоторые условия.

Я хочу обнаружить поддержку ввода-вывода файлов платформы.

Поэтому я хочу определить директиву препроцессора, такую как FILE_IO, чтобы определить, поддерживает ли эта платформа или нет.

Мне нужна была директива препроцессора, потому что я не могу использовать файловый api на неподдерживаемых платформах, поэтому мне нужно прекратить использовать их во время компиляции.

Взгляните на приведенный ниже сценарий.

Как я могу этого достичь?

Любая помощь будет оценена по достоинству.

Что я уже пробовал:

// It won't work
#define FILE_IO = !SAMSUNG_TV && !WEBGL

// OR

#if !SAMSUNG_TV && !WEBGL

// It get defined anyway
#define FILE_IO

#endif

0x01AA

а) первое неверно. См., например, #if (ссылка на C#) | Microsoft Docs[^], Unlike C and C++, you cannot assign a numeric value to a symbol; the #if statement in C# is Boolean and only tests whether the symbol has been defined or not

Б) Второй выглядит вполне нормально. Может быть, вам следует сначала убедиться, что он не определен:
#undef FILE_IO
#if !SAMSUNG_TC && !WEBGL ....

EmpireWorld

Могу ли я присвоить логическое значение #define?

Могу ли я использовать #define внутри #if?

Dave Kreskowiak

директивы # define вообще не имеют никакого значения. Вы можете только проверить, определены ли они или нет.

0x01AA

В c# вы управляете им независимо от того, существует символ или нет. Нет необходимости назначать bool или любое другое значение.

То, что я знаю, вы можете использовать #define внутри #if.

В вашем случае, я думаю, что FILE_IO уже определен, возможно, не вами. Поэтому убедитесь, что он не определен, прежде чем делать свои тесты:

#undef FILE_IO
#if !SAMSUNG_TV &&! WEBGL
#определение FILE_IO
#endif

... должен это сделать

EmpireWorld

FILE_IO не определен, я хочу определить его в своем собственном коде.

Позвольте мне попробовать #define внутри #if.

0x01AA

Вы написали: "это все равно будет определено". Если это не ваш "#if !SAMSUNG_TV &&! WEBGL", то, скорее всего, он определяется другой частью кода, которую вы используете...

EmpireWorld

Я имел в виду, что #define определяет директиву в любом случае, когда она находится внутри оператора #if is или нет.

0x01AA

Я не понимаю. В любом случае, работает ли вторая версия или нет (возможно, с #undef в качестве первой)? С моей точки зрения, так и должно быть.

1 Ответов

Рейтинг:
1

Satya Prakash Swain

#определение SAMSUNG_TC
#определение WEBGL
#if !SAMSUNG_TC &&! WEBGL
#определение FILE_IO
FILE_IO =! SAMSUNG_TC &&! WEBGL;
#endif


EmpireWorld

Строка FILE_IO = !SAMSUNG_TC &&! WEBGL; не работает.

0x01AA

Да это не работает. Опять же ссылка на документацию MS, которую стоит прочитать: #if (ссылка на C#) | Microsoft Docs[^]