Rumah >pembangunan bahagian belakang >C++ >Mengapa Beberapa Kod C Gagal Disusun dalam C?

Mengapa Beberapa Kod C Gagal Disusun dalam C?

DDD
DDDasal
2024-12-18 10:16:10406semak imbas

Why Does Some C Code Fail to Compile in C  ?

C sebagai Subset C : Pengecualian Diterangkan

Walaupun selalunya dinyatakan bahawa C ialah subset C , terdapat keadaan tertentu di mana kod mungkin disusun dengan lancar dalam C tetapi gagal dalam C .

Kes di mana Kod Gagal dalam C

  • Definisi Tentatif:
    C membenarkan berbilang pengisytiharan nama pembolehubah yang sama, tetapi C melarang ini dengan ralat "n sudah ditakrifkan."

    int n;
    int n; // error: redeclaration of 'n'
  • Turutan Tidak Serasi Jenis:
    C membenarkan menetapkan tatasusunan kepada penunjuk dengan jenis yang berbeza (cth., int[1] kepada int *()), manakala C tidak membenarkan penukaran tersebut.

    int a[1];
    int (*ap)[] = &a; // error: 'a' does not have type 'int[]'
  • Gaya Definisi Fungsi K&R:
    C membenarkan definisi fungsi menggunakan sintaks int b(a) int a; { }, tetapi C menganggapnya sebagai ralat tatabahasa.

    int b(a) int a; { } // error: grammar error
  • Skop Struktur Bersarang:
    C membolehkan pengisytiharan struct bersarang dengan skop kelas, tetapi C menganggapnya sebagai pembolehubah tempatan sebaliknya.

    struct A { struct B { int a; } b; int c; };
    struct B b; // error: 'b' has incomplete type
  • Pengisytiharan Lalai:
    C membenarkan pengisytiharan pembolehubah tanpa menyatakan jenisnya (cth., auto a;), tetapi C memerlukan eksplisit penentu jenis.

    auto a; // error: type-specifier missing

Pengecualian Tambahan dalam C99

  • Dimensi Tatasusunan dalam Parameter:
    C99 melarang penentu seperti statik dalam pelbagai dimensi fungsi parameter.

    void f(int p[static 100]) { } // error: invalid syntax
  • Tatasusunan Panjang Boleh Ubah:
    C99 tidak menyokong tatasusunan panjang berubah (VLA) di mana saiz tatasusunan dikira semasa masa jalan.

    int n = 1;
    int an[n]; // error: 'n' is not a constant expression
  • Turutan Fleksibel Ahli:
    C99 tidak mempunyai ahli tatasusunan fleksibel (FAM) yang boleh mempunyai ahli data bersaiz berubah dalam struct.

    struct A { int a; int fam[]; }; 
    // error: 'fam' has incomplete type
  • Kelayakan Had:
    C99 membenarkan kelayakan sekatan untuk menentukan bukan pengaliasian memori, yang C tidak sokongan.

    void copy(int *restrict src, int *restrict dst); // error: two names for one parameter

Atas ialah kandungan terperinci Mengapa Beberapa Kod C Gagal Disusun dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn