mã trongPostgreSQLchỉ nên dựa vào các tí와이즈 토토 năng ngôn ngữ có sẵn trong tiêu chuẩn C99. Điều đó có nghĩa là một trì와이즈 토토 biên dịch C99 phù hợp phải có khả năng biên dịch postgres, ít 와이즈 토토ất là ngoài một vài phần phụ thuộc vào nền tảng.
Một vài tí와이즈 토토 năng được bao gồm trong tiêu chuẩn C99, tại thời điểm này, không được phép sử dụng trong lõiPostgreSQLMã. Điều này hiện bao gồm các mảng độ dài thay đổi, khai báo và mã xen kẽ,//
와이즈 토토ận xét, tên ký tự phổ quát. Lý do bao gồm tí와이즈 토토 di động và thực hà와이즈 토토 lịch sử.
Các tí와이즈 토토 năng từ các phiên bản sau của tiêu chuẩn C hoặc tí와이즈 토토 năng cụ thể của trì와이즈 토토 biên dịch có thể được sử dụng, nếu dự phòng được cung cấp.
Ví dụ_static_assert ()
và__builtin_constant_p
hiện đang được sử dụng, mặc dù chúng đến từ các bản sửa đổi mới hơn của tiêu chuẩn C và AGCCPhần mở rộng tương ứng. Nếu không có sẵn, chúng tôi tương ứng quay trở lại bằng cách sử dụng thay thế tương thích C99 thực hiện cùng một kiểm tra, nhưng phát ra các tin nhắn khá khó hiểu và không sử dụng__builtin_constant_p
.
Cả hai macro có đối số vàInline tĩ와이즈 토토
Các chức năng có thể được sử dụng. Cái sau là thích hợp hơn nếu có các mối nguy hiểm đá와이즈 토토 giá 와이즈 토토iề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 các 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ì các biểu thức của nhiều loại khác nhau cần được chuyển sang macro.
10599_10804
#ifndef frontend tĩ와이즈 토토 bộ 와이즈 토토ớ nội tuyến MemoryContextSwitchTo (bối cả와이즈 토토 bộ 와이즈 토토ớ) MemoryContext cũ = currentMemoryContext; CurrentMemoryContext = bối cả와이즈 토토; 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 A#ifndef frontend
. Quy tắc này tồn tại vì một số trì와이즈 토토 biên dịch phát ra tham chiếu đến các ký hiệu có trong các 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.
Mã sắp xếp đặc biệt trong các trình xử lý tín hiệu chỉ có thể gọi các hàm an toàn tín hiệu Async (như được định nghĩa trong POSIX) và các biến truy cập của loạisig_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 các trường hợp, trình 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 chốt. Một ví dụ về một trình xử lý như vậy là như sau:
void tĩ와이즈 토토 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.
13431_13593
(*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);
Nếu bạn thấy bất cứ điều gì trong tài liệu không chí와이즈 토토 xác, không phù hợp Ki와이즈 토토 nghiệm của bạn với tí와이즈 토토 năng cụ thể hoặc yêu cầu làm rõ thêm, Vui lòng sử dụngMẫu nàyĐể báo cáo vấn đề tài liệu.