các biến toàn cục được chia sẻ trong C


82

Làm cách nào để tạo các biến toàn cục được chia sẻ trong C? Nếu tôi đặt nó trong một tệp tiêu đề, thì trình liên kết sẽ phàn nàn rằng các biến đã được xác định. Có phải cách duy nhất để khai báo biến trong một trong các tệp C của tôi và đặt thủ công externs ở đầu tất cả các tệp C khác muốn sử dụng nó không? Điều đó nghe có vẻ không lý tưởng.


Được chia sẻ trong mã nguồn của riêng bạn? Đặt khai báo extern trong một tệp tiêu đề và định nghĩa trong một nguồn (duy nhất) khác. Tất nhiên, chúng được chia sẻ giữa các chuỗi quy trình của bạn. Để chia sẻ dữ liệu giữa các quá trình, hãy sử dụng cơ chế IPC (bộ nhớ dùng chung, đường ống).
Hernán



Câu trả lời:


63

Trong tệp tiêu đề, hãy viết nó với extern. Và ở phạm vi toàn cục của một trong các tệp c khai báo nó mà không có extern.


1
Thay vào đó, chúng ta có thể khai báo nó trong tệp tiêu đề của tệp * .c đó không?
Geremia

91

Trong một tệp tiêu đề (shared.h):

extern int this_is_global;

Trong mọi tệp mà bạn muốn sử dụng ký hiệu chung này, hãy bao gồm tiêu đề chứa khai báo bên ngoài:

#include "shared.h"

Để tránh nhiều định nghĩa về trình liên kết, chỉ cần một khai báo về biểu tượng chung của bạn phải có trên các đơn vị biên dịch của bạn (ví dụ: shared.cpp):

/* shared.cpp */
#include "shared.h"
int this_is_global;

bạn có tài liệu tham khảo ưu tiên nào để tìm hiểu thêm về cơ chế IPC không?
NickO

7
Hãy nhấn mạnh hơn vào "chỉ một tuyên bố về biểu tượng toàn cầu của bạn ..." Tôi đã có khai báo trên tất cả các tệp c mà tôi muốn sử dụng các biến toàn cục trên :(
AntonioCS 27/12/13

22

Trong tệp tiêu đề

tập tin tiêu đề

#ifndef SHAREFILE_INCLUDED
#define SHAREFILE_INCLUDED
#ifdef  MAIN_FILE
int global;
#else
extern int global;
#endif
#endif

Trong tệp có tệp bạn muốn toàn cầu tồn tại:

#define MAIN_FILE
#include "share.h"

Trong các tệp khác cần phiên bản bên ngoài:

#include "share.h"

à đây là giải pháp mà tôi đã có cách đây một lúc - tôi đã quên về biến tiền xử lý MAIN_FILE. i thinik i như câu trả lời chấp nhận cur hơn tho
Claudiu

15

Bạn đặt khai báo trong tệp tiêu đề, ví dụ:

 extern int my_global;

Trong một trong các tệp .c của bạn, bạn xác định nó ở phạm vi toàn cầu.

int my_global;

Mọi tệp .c muốn truy cập my_globalbao gồm tệp tiêu đề có phần externtrong.


5

Nếu bạn đang chia sẻ mã giữa C và C ++, hãy nhớ thêm phần sau vào shared.htệp:

#ifdef __cplusplus
extern "C" {
#endif

extern int my_global;
/* other extern declarations ... */

#ifdef __cplusplus
}
#endif

2

Có một cách gọn gàng hơn chỉ với một tệp tiêu đề để bảo trì đơn giản hơn. Trong tiêu đề với các biến toàn cục đặt tiền tố mỗi khai báo với một từ khóa (tôi sử dụng phổ biến) sau đó chỉ trong một tệp nguồn bao gồm nó như thế này

#define common
#include "globals.h"
#undef common

và bất kỳ tệp nguồn nào khác như thế này

#define common extern
#include "globals.h"
#undef common

Chỉ cần đảm bảo rằng bạn không khởi tạo bất kỳ biến nào trong tệp global.h, nếu không trình liên kết sẽ vẫn phàn nàn vì một biến đã khởi tạo không được coi là bên ngoài ngay cả với từ khóa extern. Tệp global.h trông tương tự như thế này

#pragma once
common int globala;
common int globalb;
etc.

dường như hoạt động cho bất kỳ loại khai báo nào. Tất nhiên, không sử dụng từ khóa phổ biến trên #define.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.