it-swarm-id.com

C / C ++ global vs statis global

Kemungkinan Gandakan:
Static vs global

Saya bingung tentang perbedaan antara variabel global global dan statis. Jika statis berarti bahwa variabel ini bersifat global hanya untuk file yang sama maka mengapa dalam dua file berbeda nama yang sama menyebabkan tabrakan nama?

Adakah yang bisa menjelaskan hal ini?

50
Vladp

Variabel global (bukan static) ada ketika Anda membuat .o file tersedia untuk tautan untuk digunakan dalam file lain. Karenanya, jika Anda memiliki dua file seperti ini, Anda akan mendapatkan nama tabrakan di a:

a.c:

#include <stdio.h>

int a;

int compute(void);

int main()
{
    a = 1;
    printf("%d %d\n", a, compute());
    return 0;
}

b.c:

int a;

int compute(void)
{
    a = 0;
    return a;
}

karena tautan tidak tahu mana dari global a yang digunakan.

Namun, ketika Anda mendefinisikan global statis, Anda memberi tahu kompiler untuk menjaga variabel hanya untuk file itu dan jangan biarkan linker mengetahuinya. Jadi jika Anda menambahkan static (dalam definisi a) ke dua kode sampel yang saya tulis, Anda tidak akan mendapatkan tabrakan nama hanya karena penghubung bahkan tidak tahu ada a di salah satu file:

a.c:

#include <stdio.h>

static int a;

int compute(void);

int main()
{
    a = 1;
    printf("%d %d\n", a, compute());
    return 0;
}

b.c:

static int a;

int compute(void)
{
    a = 0;
    return a;
}

Ini berarti bahwa setiap file bekerja dengan a sendiri tanpa mengetahui tentang yang lain.


Sebagai catatan, tidak masalah memiliki salah satu dari mereka static dan yang lainnya tidak selama mereka berada di file yang berbeda. Jika dua deklarasi berada dalam file yang sama (baca unit terjemahan ), satu static dan satu extern, lihat - jawaban ini .

82
Shahbaz

Nama yang statis di setiap file harus tidak menyebabkan tabrakan nama. Jika Anda melihatnya, silakan kirim kode demo (pendek) yang menunjukkannya, bersama dengan kompiler yang tepat yang Anda gunakan sehingga kami dapat memverifikasi kode dengan benar dan menganggapnya benar, lakukan verifikasi terhadap kompiler dengan benar.

Hanya FWIW, metode yang disukai dalam C++ adalah menggunakan namespace anonim sebagai gantinya:

namespace { 
    int not_a_static_variable;
}

Dalam semua kejujuran, tidak, saya tidak bisa menunjukkan banyak keuntungan obyektif untuk itu ...

8
Jerry Coffin