Поделиться через


Ошибки и предупреждения препроцессора

Компилятор создает следующие ошибки для неправильного использования директив препроцессора:

  • CS1024: ожидаемая директива препроцессора
  • CS1025: ожидается однострочный комментарий или конец строки
  • CS1027: ожидается директива #endif
  • CS1028: непредвиденная директива препроцессора
  • CS1029: #error: "text"
  • CS1030: #warning: "text"
  • CS1032: не удается определить или отменить символы препроцессора после первого маркера в файле
  • CS1038: ожидается директива #endregion
  • CS1040: директивы препроцессора должны отображаться как первый символ, отличный от пробела в строке
  • CS1517: недопустимое выражение препроцессора
  • CS1560: недопустимое имя файла, указанное для директивы препроцессора. Имя файла слишком длинное или недопустимое имя файла
  • CS1576: номер строки, указанный для директивы #line, отсутствует или недопустим
  • CS1578: имя файла, однострочный комментарий или ожидаемый конец строки
  • CS1633: неразпознанная директива #pragma
  • CS1634: ожидаемое отключение или восстановление
  • CS1635: не удается восстановить предупреждение "предупреждающий код", так как он был отключен глобально
  • CS1691: 'номер' не является допустимым номером предупреждения
  • CS1692: недопустимое число
  • CS1694: недопустимое имя файла, указанное для директивы препроцессора. Имя файла слишком длинное или недопустимое имя файла
  • CS1695: Некорректный синтаксис #pragma checksum; должно быть #pragma checksum "имя файла" "{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" "XXXX..."
  • CS1696: ожидается однострочный комментарий или конец строки
  • CS1709: имя файла, указанное для директивы препроцессора, пусто
  • CS7009: не удается использовать #r после первого маркера в файле
  • CS7010: ожидается имя файла в кавычках
  • CS7011: #r разрешено только в сценариях
  • CS8097: #load разрешено только в сценариях
  • CS8098: не удается использовать #load после первого маркера в файле
  • CS8938: значение директивы #line отсутствует или не находится в допустимом диапазоне
  • CS8939: положение конца директивы #line должно быть больше или равно начальной позиции.
  • CS8996: необработанные строковые литералы не допускаются в директивах препроцессора
  • CS9028: директива #line диапазона требует пробела перед первой скобкой, перед смещением символов и перед именем файла
  • CS9297: #: директивы не могут быть после первого маркера в файле
  • CS9298: #: директивы могут использоваться только в файловых программах (-features:FileBasedProgram)
  • CS9299: #: директивы не могут быть после #if директивы
  • CS9314: #! директивы могут использоваться только в сценариях или файловых программах

Недопустимый синтаксис директивы препроцессора

  • CS1024: ожидаемая директива препроцессора
  • CS1025: ожидается однострочный комментарий или конец строки
  • CS1027: ожидается директива #endif
  • CS1028: непредвиденная директива препроцессора
  • CS1038: ожидается директива #endregion
  • CS1040: директивы препроцессора должны отображаться как первый символ, отличный от пробела в строке
  • CS1517: недопустимое выражение препроцессора
  • CS1633: Нераспознанная директива #pragma
  • CS1696: ожидается однострочный комментарий или конец строки
  • CS8996: необработанные строковые литералы не допускаются в директивах препроцессора

Эти ошибки указывают на то, что для директив препроцессора использовался недопустимый синтаксис. Наиболее вероятные причины:

  • Использование нераспознанной директивы после # (CS1024, CS1633).
  • Включая многострочные комментарии в строках директив (CS1025, CS1696).
  • Использование директив в неожиданных местах (CS1028).
  • Отсутствуют необходимые директивы сопоставления (CS1027, CS1038).
  • Не определяя или неопределяя символы в качестве первого маркера в файле (CS1032)
  • Неправильное размещение директивы в качестве первого токена в строке (CS1040).
  • Использование недопустимых выражений в условной компиляции (CS1517).
  • Использование необработанных строковых литералов в директивах препроцессора (CS8996).

Пример CS1024 — ожидаемая директива препроцессора:

#import System   // CS1024 - "import" is not a valid directive

Пример CS1025 — ожидается однострочный комментарий или конец строки:

#if true /* hello  
*/   // CS1025 - multiline comment not allowed
#endif

Пример CS1027 — ожидается директива #endif:

#if true   // CS1027 - missing #endif
class Test { }

Пример CS1028 — непредвиденная директива препроцессора:

#endif   // CS1028 - no matching #if

Пример CS1032 — #define и #undef директивы препроцессора должны отображаться перед другими токенами:

/* Comment */ 
#define X   // CS1032 - directive not first token in file

Пример CS1038 — ожидается директива #endregion:

#region testing
class Test { }
// CS1038 - missing #endregion

Пример CS1040. Директивы препроцессора должны отображаться как первый символ, отличный от пробела:

/* Comment */ #define X   // CS1040 - directive not first on line

Пример CS1517 — недопустимое выражение препроцессора:

#if 1           // CS1517 - numeric literals not allowed
#endif
#if ~symbol     // CS1517 - bitwise operators not allowed  
#endif

Пример CS1633 — нераспознанная директива #pragma:

#pragma unknown  // CS1633 - "unknown" is not a valid pragma

Пример CS8996. Необработанные строковые литералы не допускаются в директивах препроцессора:

// CS8996.cs
#pragma checksum """raw_string""" "{406EA660-64CF-4C82-B6F0-42D48172A799}" "hash"  // CS8996
class Test { }

Чтобы устранить эту ошибку, используйте обычный строковый литерал:

#pragma checksum "filename.cs" "{406EA660-64CF-4C82-B6F0-42D48172A799}" "hash"  // OK
class Test { }

Чтобы устранить эти ошибки, убедитесь, что директивы препроцессора соответствуют правильным правилам синтаксиса, описанным в документации по директивам препроцессора.

ошибки директивы #error и #warning

  • CS1029: #error: "text"
  • CS1030: #warning: "text"
  • CS1634: ожидаемое отключение или восстановление
  • CS1635: не удается восстановить предупреждение "предупреждающий код", так как он был отключен глобально
  • CS1691: "number" не является допустимым номером предупреждения
  • CS1692: недопустимое число

Эти ошибки возникают, когда компилятор обрабатывает #error#warningи #pragma warning директивы. Эти директивы позволяют создавать пользовательские сообщения об ошибках и предупреждениях во время компиляции и управления предупреждениями.

CS1029 отображает текст ошибки, определенной директивой #error :

// CS1029.cs
class Sample
{
   static void Main()
   {
      #error Let's give an error here   // CS1029
   }
}

В результате компиляции формируются следующие результаты:

example.cs(9,8): error CS1029: #error: 'Let's give an error here   // CS1029  '

CS1030 отображает текст предупреждения, определенного директивой #warning :

// CS1030.cs
class Sample
{
   static void Main()
   {
      #warning Let's give a warning here
   }
}

В результате компиляции формируются следующие результаты:

example.cs(6,16): warning CS1030: #warning: 'Let's give a warning here'

CS1634 возникает, когда #pragma warning директива плохо сформирована, например, если пропущены команды отключения или восстановления.

// CS1634.cs
// compile with: /W:1

#pragma warning   // CS1634
// Try this instead:
// #pragma warning disable 0219

class MyClass
{
  public static void Main()
  {
  }
}

CS1635 возникает при использовании параметра командной строки или параметра проекта для глобального /nowarn отключения предупреждения, но используется #pragma warning restore для восстановления этого предупреждения:

// CS1635.cs
// compile with: /w:1 /nowarn:162

enum MyEnum {one=1,two=2,three=3};

class MyClass
{
    public static void Main()
    {
#pragma warning disable 162

    if (MyEnum.three == MyEnum.two)
        System.Console.WriteLine("Duplicate");

#pragma warning restore 162  // CS1635
    }
}

CS1691 возникает, когда число, переданное #pragma warning директиве, не является допустимым номером предупреждения:

// CS1691.cs
public class C
{
    int i = 1;
    public static void Main()
    {
        C myC = new C();
#pragma warning disable 151  // CS1691
// Try the following line instead:
// #pragma warning disable 1645
        myC.i++;
#pragma warning restore 151  // CS1691
// Try the following line instead:
// #pragma warning restore 1645
    }
}

CS1692 возникает, когда число в директивах препроцессора, например #pragma и #line недопустимо, так как оно слишком велико, в неправильном формате или содержит недопустимые символы:

// CS1692.cs

#pragma warning disable a  // CS1692
// Try this instead:
// #pragma warning disable 1691

class A
{
    static void Main()
    {
    }
}

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

#line и ошибки директив файла

  • CS1560: недопустимое имя файла, указанное для директивы препроцессора. Имя файла слишком длинное или недопустимое имя файла
  • CS1576: Указанный для директивы #line номер строки отсутствует или недопустим
  • CS1578: имя файла, однострочный комментарий или ожидаемый конец строки
  • CS1694: недопустимое имя файла, указанное для директивы препроцессора. Имя файла слишком длинное или недопустимое имя файла
  • CS1695: недопустимый синтаксис #pragma контрольная сумма; следует #pragma контрольная сумма "имя_файла" "{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" "XXXX..."
  • CS1709: имя файла, указанное для директивы препроцессора, пусто
  • CS8938: значение директивы #line отсутствует или выходит за пределы допустимого диапазона
  • CS8939: положение конца директивы #line должно быть больше или равно начальной позиции.
  • CS9028: директива #line диапазона требует пробела перед первой скобкой, перед смещением символов и перед именем файла

Эти ошибки указывают на неправильное #line использование директив или директив препроцессора, связанных с файлами. Наиболее вероятные причины:

  • Недопустимые или отсутствующие имена файлов (CS1560, CS1694, CS1709).
  • Неправильный формат номеров строк или значений (CS1576, CS8938, CS8939).
  • Отсутствует правильный синтаксис для имен файлов и комментариев (CS1578).
  • Неправильный #pragma checksum синтаксис (CS1695).
  • Неправильное интервалирование в #line директивах диапазона (CS9028).

Пример CS1560/CS1694 — недопустимое имя файла:

#line 100 "MyFile1234567890MyFile1234567890MyFile1234567890MyFile1234567890MyFile1234567890MyFile1234567890MyFile1234567890MyFile1234567890MyFile1234567890MyFile1234567890MyFile1234567890MyFile1234567890MyFile1234567890MyFile1234567890MyFile1234567890MyFile1234567890.txt"   // CS1560/CS1694 - filename too long

Пример CS1576 — номер строки отсутствует или недопустим:

#line "abc.sc"         // CS1576 - missing line number
#line abc "file.cs"    // CS1576 - invalid line number format

Пример CS1578 — имя файла, комментарий или ожидаемый конец строки:

#line 101 abc.cs   // CS1578 - filename not quoted

Пример CS1695 — недопустимый синтаксис контрольной суммы #pragma:

#pragma checksum "12345"  // CS1695 - missing GUID and checksum

Пример CS1709 — пустое имя файла:

#pragma checksum "" "{406EA660-64CF-4C82-B6F0-42D48172A799}" ""  // CS1709 - empty filename

Пример CS8938 — значение директивы #line отсутствует или выходит за пределы допустимого диапазона:

#line   // CS8938 - missing value
#line 0  // CS8938 - out of range (must be 1-16,707,566)

Пример CS8939 — ошибка в позиции конца директивы #line:

#line (1, 10) - (1, 5) "file.cs"  // CS8939 - end column < start column

Пример CS9028 — интервалы директив диапазона #line:

#line(1, 1) - (1, 10)"file.cs"  // CS9028 - missing spaces

Чтобы устранить эти ошибки, убедитесь, что #line директивы и директивы препроцессора, связанные с файлами, соответствуют правильному синтаксису, как описано в документации по директивам препроцессора.

Неправильное использование директив приложений на основе файлов

  • CS9297: #: директивы не могут быть после первого токена в файле
  • CS9298: #: директивы могут использоваться только в файловых программах (-features:FileBasedProgram)
  • CS9299: #: директива не может следовать за #if директивой
  • CS9314: #! директивы могут использоваться только в сценариях или файловых программах

Эти ошибки указывают на неправильное использование #: директив для приложения на основе файлов. Дополнительные сведения о синтаксисе этих директив см. в статье по директивам препроцессора в разделе о приложениях на основе файлов. Кроме того, вы можете изучить приложения на основе файлов, следуя руководству по приложениям на основе файлов.

Файл содержит директивы script.cs

Следующие ошибки указывают на синтаксические ошибки в скомпилированном файле script.cs C#.

  • CS7009: не удается использовать #r после первого маркера в файле
  • CS7010: ожидаемое имя файла с кавычками
  • CS7011: #r разрешено только в сценариях
  • CS8097: #load разрешено только в сценариях

Эти директивы не поддерживаются в скомпилированном C#. Их необходимо удалить или использовать script.cs.