Mã trongPostgreSQLchỉ nên dựa vào kèo bóng đá euro tính năng ngôn ngữ có sẵn trong tiêu chuẩn C89. Điều đó có nghĩa là một trình biên dịch C89 phù hợp phải có khả năng biên dịch postgres, ít nhất là ngoài một vài phần phụ thuộc vào nền tảng. kèo bóng đá euro tính năng từ bản sửa đổi sau của tiêu chuẩn C hoặc tính năng cụ thể của trình biên dịch có thể được sử dụng, nếu dự phòng được cung cấp.
Ví dụInline tĩnh
và_static_assert ()
hiện đang được sử dụng, mặc dù chúng là từ kèo bóng đá euro bản sửa đổi mới hơn của tiêu chuẩn C. Nếu không có sẵn, chúng tôi tương ứng quay trở lại để xác định kèo bóng đá euro chức năng mà không có nội tuyến và sử dụng thay thế tương thích C89 thực hiện kèo bóng đá euro kiểm tra tương tự, nhưng phát ra kèo bóng đá euro thông báo khá khó hiểu.
Cả hai macro có đối số vàInline tĩnh
kèo bóng đá euro chức năng có thể được sử dụng. Cái sau là thích hợp hơn nếu có kèo bóng đá euro mối nguy hiểm đánh giá nhiều khi được viết dưới dạng macro, ví dụ: trường hợp với
#Define Max (x, y) ((x) (y)? (X): (y))
hoặc khi macro sẽ rất dài. Trong kèo bóng đá euro trường hợp khác, chỉ có thể sử dụng macro, hoặc ít nhất là dễ dàng hơn. Ví dụ: vì kèo bóng đá euro biểu thức của nhiều loại khác nhau cần được chuyển sang macro.
10333_10538
#IFNDEF Frontend tĩnh bộ nhớ nội tuyến MemoryContextSwitchTo (bối cảnh bộ nhớ) MemoryContext cũ = currentMemoryContext; CurrentMemoryContext = bối cảnh; trả lại cũ;
Trong ví dụ nàyCurrentMemoryContext
, chỉ có sẵn trong phần phụ trợ, được tham chiếu và chức năng do đó ẩn với#ifndef frontend
. Quy tắc này tồn tại vì một số trình biên dịch phát ra tham chiếu đến kèo bóng đá euro ký hiệu có trong kèo bóng đá euro hàm nội tuyến ngay cả khi hàm không được sử dụng.
Để phù hợp để chạy bên trong mã xử lý tín hiệu phải được viết rất cẩn thận. Vấn đề cơ bản là, trừ khi bị chặn, một trình xử lý tín hiệu có thể làm gián đoạn mã bất cứ lúc nào. Nếu mã bên trong trình xử lý tín hiệu sử dụng cùng trạng thái như mã bên ngoài hỗn loạn có thể xảy ra. Ví dụ, hãy xem xét những gì xảy ra nếu trình xử lý tín hiệu cố gắng có được một khóa đã được giữ trong mã bị gián đoạn.
11762_11910SIG_ATOMIC_T dễ bay hơi
. Một vài chức năng trongPostgres
cũng được coi là tín hiệu an toàn, quan trọng làsetLatch ()
.
Trong hầu hết kèo bóng đá euro trường hợp, người xử lý tín hiệu không nên làm gì hơn là lưu ý rằng tín hiệu đã đến và đánh thức mã chạy bên ngoài trình xử lý bằng cách sử dụng chốt. Một ví dụ về một trình xử lý như vậy là như sau:
void tĩnh tay cầm_sighup (tín hiệu_args) int save_errno = errno; got_sighup = true; Setlatch (mylatch); errno = save_errno;
errno
được lưu và khôi phục vìsetLatch ()
Có thể thay đổi nó. Nếu điều đó không được thực hiện mã bị gián đoạn hiện đang kiểm traerrno
có thể thấy giá trị sai.
12983_13145
(*emit_log_hook) (edata);
(mặc dùEMIT_LOG_HOOK (EDATA)
cũng sẽ hoạt động). Khi con trỏ chức năng là một phần của cấu trúc, thì dấu câu thêm có thể và thường nên được bỏ qua, ví dụ:
paraminfo- paramfetch (paraminfo, paramid);