Udostępnij za pomocą


Błędy i ostrzeżenia preprocesora

Kompilator generuje następujące błędy dotyczące nieprawidłowego użycia dyrektyw preprocesora:

  • CS1024: Oczekiwana dyrektywa preprocesora
  • CS1025: Oczekiwano komentarza jednowierszowego lub końca wiersza
  • CS1027: oczekuje się dyrektywy #endif
  • CS1028: Nieoczekiwana dyrektywa preprocesora
  • CS1029: #error: "text"
  • CS1030: #warning: "text"
  • CS1032: Nie można zdefiniować/oddefiniować symboli preprocesora po pierwszym elemencie w pliku
  • CS1038: oczekiwana dyrektywa #endregion
  • CS1040: Dyrektywy preprocesora muszą być wyświetlane jako pierwszy znak inny niż biały znak w wierszu
  • CS1517: Nieprawidłowe wyrażenie preprocesora
  • CS1560: Nieprawidłowa nazwa pliku określona dla dyrektywy preprocesora. Nazwa pliku jest za długa lub nieprawidłowa nazwa pliku
  • CS1576: Brak numeru wiersza określonego dla dyrektywy #line lub jest on nieprawidłowy
  • CS1578: Nazwa pliku, komentarz jednowierszowy lub oczekiwany koniec wiersza
  • CS1633: Nierozpoznana dyrektywa #pragma
  • CS1634: Oczekiwano wyłączenia lub przywrócenia
  • CS1635: Nie można przywrócić ostrzeżenia "kod ostrzegawczy", ponieważ został on wyłączony globalnie
  • CS1691: "liczba" nie jest prawidłowym numerem ostrzeżenia
  • CS1692: Nieprawidłowa liczba
  • CS1694: Nieprawidłowa nazwa pliku określona dla dyrektywy preprocesora. Nazwa pliku jest za długa lub nieprawidłowa nazwa pliku
  • CS1695: Nieprawidłowa składnia #pragma checksum; powinna być #pragma checksum "nazwa pliku" "{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" "XXXX..."
  • CS1696: Oczekiwano komentarza jednowierszowego lub końca wiersza
  • CS1709: Nazwa pliku określona dla dyrektywy preprocesora jest pusta
  • CS7009: Nie można użyć #r po pierwszym tokenie w pliku
  • CS7010: Oczekiwano nazwy pliku w cudzysłowie
  • CS7011: #r jest dozwolona tylko w skryptach
  • CS8097: #load jest dozwolona tylko w skryptach
  • CS8098: Nie można użyć #load po pierwszym tokenie w pliku
  • CS8938: Brak wartości dyrektywy #line lub poza zakresem
  • CS8939: Pozycja końcowa dyrektywy #line musi być większa lub równa pozycji początkowej
  • CS8996: Surowe literały łańcuchowe nie można używać w dyrektywach preprocesora
  • CS9028: Dyrektywa #line span wymaga spacji przed pierwszym nawiasem, przed przesunięciem znaku i przed nazwą pliku
  • CS9297: #: dyrektywy nie mogą znajdować się po pierwszym tokenie w pliku
  • CS9298: #: dyrektywy mogą być używane tylko w programach opartych na plikach (-features:FileBasedProgram)
  • CS9299: Nie można używać #: dyrektyw po #if dyrektywie
  • CS9314: #! dyrektywy mogą być używane tylko w skryptach lub programach opartych na plikach

Nieprawidłowa składnia dyrektywy preprocesora

  • CS1024: Oczekiwana dyrektywa preprocesora
  • CS1025: Oczekiwano komentarza jednowierszowego lub końca wiersza
  • CS1027: oczekiwana dyrektywa #endif
  • CS1028: Nieoczekiwana dyrektywa preprocesora
  • CS1038: oczekiwana dyrektywa #endregion
  • CS1040: Dyrektywy preprocesora muszą być wyświetlane jako pierwszy znak inny niż biały znak w wierszu
  • CS1517: Nieprawidłowe wyrażenie preprocesora
  • CS1633: Nierozpoznana dyrektywa #pragma
  • CS1696: Oczekiwano komentarza jednowierszowego lub końca wiersza
  • CS8996: Dosłowne literały łańcuchowe nie wolno używać w dyrektywach preprocesora

Te błędy wskazują, że użyto nieprawidłowej składni dla dyrektyw preprocesora. Typowe przyczyny:

  • Używanie nierozpoznanej dyrektywy po # (CS1024, CS1633).
  • Uwzględniając komentarze wielowierszowe w wierszach dyrektyw (CS1025, CS1696).
  • Używanie dyrektyw w nieoczekiwanych lokalizacjach (CS1028).
  • Brak wymaganych dyrektyw dopasowania (CS1027, CS1038).
  • Nie zdefiniowanie lub niezdefiniowanie symboli jako pierwszego tokenu w pliku (CS1032)
  • Nie umieszczaj dyrektywy jako pierwszego tokenu w wierszu (CS1040).
  • Używanie nieprawidłowych wyrażeń w kompilacji warunkowej (CS1517).
  • Używanie nieprzetworzonych literałów ciągów w dyrektywach preprocesora (CS8996).

Przykład CS1024 — oczekiwana dyrektywa preprocesora:

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

Przykład CS1025 — oczekiwany komentarz jednowierszowy lub zakończenie wiersza:

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

Przykład CS1027 — oczekiwana dyrektywa #endif:

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

Przykład CS1028 — nieoczekiwana dyrektywa preprocesora:

#endif   // CS1028 - no matching #if

Przykład CS1032 — #define i #undef dyrektywy preprocesora muszą pojawić się przed innymi tokenami:

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

Przykład CS1038 — oczekiwana dyrektywa #endregion:

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

Przykład CS1040 — dyrektywy preprocesora muszą być wyświetlane jako pierwszy znak inny niż biały:

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

Przykład CS1517 — nieprawidłowe wyrażenie preprocesora:

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

Przykład CS1633 — nierozpoznana dyrektywa #pragma:

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

Przykład CS8996 — literały ciągu nieprzetworzonego nie są dozwolone w dyrektywach preprocesora:

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

Aby naprawić ten błąd, użyj zwykłego literału ciągu:

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

Aby naprawić te błędy, upewnij się, że dyrektywy preprocesora są zgodne z poprawnymi regułami składni opisanymi w dokumentacji dyrektyw preprocesora.

Błędy dyrektywy #error i #warning

  • CS1029: #error: "text"
  • CS1030: #warning: "text"
  • CS1634: Oczekiwano wyłączenia lub przywrócenia
  • CS1635: Nie można przywrócić ostrzeżenia "kod ostrzeżenia", ponieważ zostało ono wyłączone na poziomie globalnym
  • CS1691: "liczba" nie jest prawidłowym numerem ostrzeżenia
  • CS1692: Nieprawidłowa liczba

Te błędy występują, gdy kompilator przetwarza dyrektywy #error, #warning, i #pragma warning. Te dyrektywy umożliwiają generowanie niestandardowych komunikatów o błędach i ostrzeżeniach podczas kompilacji oraz zarządzanie zachowaniem ostrzeżeń.

CS1029 wyświetla tekst błędu zdefiniowanego dyrektywą #error :

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

Kompilacja generuje następujące dane wyjściowe:

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

CS1030 wyświetla tekst ostrzeżenia zdefiniowanego dyrektywą #warning :

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

Kompilacja generuje następujące dane wyjściowe:

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

CS1634 występuje, gdy klauzula #pragma warning jest źle sformułowana, na przykład gdy pominięto wyłączenie lub przywracanie.

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

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

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

CS1635 występuje, gdy używasz /nowarn opcji wiersza polecenia lub ustawienia projektu, aby wyłączyć ostrzeżenie globalnie, ale użyj polecenia #pragma warning restore , aby spróbować przywrócić to ostrzeżenie:

// 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 występuje, gdy podana liczba do dyrektywy #pragma warning nie jest prawidłowym numerem ostrzeżenia.

// 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 występuje, gdy liczba dyrektyw preprocesora, takich jak #pragma i #line jest nieprawidłowa, ponieważ jest zbyt duża, w niewłaściwym formacie lub zawiera niedozwolone znaki:

// CS1692.cs

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

class A
{
    static void Main()
    {
    }
}

Te dyrektywy są przydatne w scenariuszach kompilacji warunkowej, w których deweloperzy chcą otrzymywać alerty dotyczące określonych warunków w kodzie lub kontrolować, które ostrzeżenia są wyświetlane podczas kompilacji. Aby uzyskać więcej informacji na temat używania tych dyrektyw, zobacz dokumentację dyrektyw preprocesora i ostrzeżenie #pragma.

#line i błędy związane z dyrektywami dotyczącymi plików

  • CS1560: Nieprawidłowa nazwa pliku określona dla dyrektywy preprocesora. Nazwa pliku jest za długa lub nieprawidłowa nazwa pliku
  • CS1576: Brak numeru wiersza określonego dla dyrektywy #line lub jest on nieprawidłowy
  • CS1578: Nazwa pliku, komentarz jednowierszowy lub oczekiwany koniec wiersza
  • CS1694: Nieprawidłowa nazwa pliku określona dla dyrektywy preprocesora. Nazwa pliku jest za długa lub nieprawidłowa nazwa pliku
  • CS1695: Nieprawidłowa składnia sumy kontrolnej #pragma; powinna być #pragma sumy kontrolnej "nazwa pliku" "{XXXXXXXX-XXXX-XXXX-XXXXXXXXXXXX}" "XXXX..."
  • CS1709: Nazwa pliku określona dla dyrektywy preprocesora jest pusta
  • CS8938: Brak wartości dyrektywy #line lub poza zakresem
  • CS8939: Pozycja końcowa dyrektywy #line musi być większa lub równa pozycji początkowej
  • CS9028: Dyrektywa #line span wymaga spacji przed pierwszym nawiasem, przed przesunięciem znaku i przed nazwą pliku

Te błędy wskazują na nieprawidłowe użycie #line dyrektywy lub dyrektyw preprocesora związanych z plikami. Typowe przyczyny:

  • Nieprawidłowe lub brakujące nazwy plików (CS1560, CS1694, CS1709).
  • Niepoprawny format lub wartości numeru wiersza (CS1576, CS8938, CS8939).
  • Brak prawidłowej składni nazw plików i komentarzy (CS1578).
  • Źle sformułowana składnia #pragma checksum (CS1695).
  • Nieprawidłowe odstępy w dyrektywach typu #line span (CS9028).

Przykład CS1560/CS1694 — podano nieprawidłową nazwę pliku:

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

Przykład CS1576 — brak numeru wiersza lub jest on nieprawidłowy:

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

Przykład CS1578 — oczekiwano nazwy pliku, komentarza lub końca wiersza:

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

Przykład CS1695 — nieprawidłowa składnia sumy kontrolnej #pragma:

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

Przykład CS1709 — pusta nazwa pliku:

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

Przykład CS8938 — brak wartości dyrektywy #line lub poza zakresem:

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

Przykład CS8939 — błąd przy końcowej pozycji dyrektywy #line:

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

Przykład CS9028 — #line odstępy między dyrektywami:

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

Aby naprawić te błędy, upewnij się, że #line dyrektywy i dyrektywy preprocesora związane z plikami są zgodne z poprawną składnią zgodnie z opisem w dokumentacji dyrektyw preprocesora.

Nieprawidłowe użycie dyrektyw aplikacji opartych na plikach

  • CS9297: #: dyrektywy nie mogą znajdować się za pierwszym tokenem w pliku
  • CS9298: #: dyrektywy mogą być używane tylko w programach opartych na plikach (-features:FileBasedProgram)
  • CS9299: #: dyrektywy nie mogą być po #if dyrektywie
  • CS9314: #! dyrektywy mogą być używane tylko w skryptach lub programach opartych na plikach

Te błędy wskazują, że niepoprawnie użyto dyrektyw #: dla aplikacji plikowej. Więcej informacji na temat składni tych dyrektyw można dowiedzieć się w artykule dotyczącym dyrektyw preprocesora w sekcji dotyczącej aplikacji opartych na plikach. Możesz też eksplorować aplikacje oparte na plikach, wykonując czynności opisane w samouczku dotyczącym aplikacji opartych na plikach.

Plik zawiera dyrektywy script.cs

Następujące błędy wskazują na składnię script.cs w skompilowanym pliku C#:

  • CS7009: Nie można użyć #r po pierwszym tokenie w pliku
  • CS7010: Oczekiwano nazwy pliku w cudzysłowie
  • CS7011: #r jest dozwolona tylko w skryptach
  • CS8097: #load jest dozwolona tylko w skryptach

Te dyrektywy nie są obsługiwane w skompilowanym języku C#. Należy je usunąć lub użyć script.cs.