Là #pragma một khi an toàn bao gồm bảo vệ?


311

Tôi đã đọc rằng có một số tối ưu hóa trình biên dịch khi sử dụng #pragma oncecó thể dẫn đến việc biên dịch nhanh hơn. Tôi nhận ra rằng điều đó là không chuẩn, và do đó có thể đặt ra vấn đề tương thích đa nền tảng.

Đây có phải là thứ được hỗ trợ bởi hầu hết các trình biên dịch hiện đại trên các nền tảng không phải là windows (gcc) không?

Tôi muốn tránh các vấn đề biên dịch nền tảng, nhưng cũng muốn tránh các công việc phụ của các vệ sĩ dự phòng:

#pragma once
#ifndef HEADER_H
#define HEADER_H

...

#endif // HEADER_H

Tôi có nên quan tâm không? Tôi có nên dành thêm năng lượng tinh thần cho việc này?


3
Sau khi hỏi một câu hỏi tương tự , tôi phát hiện ra rằng có #pragma oncevẻ như tránh được một số vấn đề về chế độ xem lớp trong VS 2008. Tôi đang trong quá trình loại bỏ các vệ sĩ và thay thế tất cả bằng #pragma oncelý do này.
SmacL

Câu trả lời:


189

Việc sử dụng #pragma oncenên hoạt động trên bất kỳ trình biên dịch hiện đại nào, nhưng tôi không thấy bất kỳ lý do nào để không sử dụng một tiêu chuẩn #ifndefbao gồm bảo vệ. Nó hoạt động tốt. Một lưu ý là GCC không hỗ trợ #pragma oncetrước phiên bản 3.4 .

Tôi cũng thấy rằng, ít nhất là trên GCC, nó nhận ra tiêu chuẩn #ifndefbao gồm bảo vệ và tối ưu hóa nó , vì vậy nó không nên chậm hơn nhiều #pragma once.


12
Không nên chậm hơn chút nào (với GCC nào).
Jason Coco

54
Nó không được thực hiện theo cách đó. Thay vào đó, nếu tệp bắt đầu bằng #ifndef lần đầu tiên và kết thúc bằng #endif, gcc sẽ nhớ nó và luôn bỏ qua bao gồm trong tương lai mà không cần phải mở tệp.
Jason Coco

10
#pragma oncenói chung là nhanh hơn vì tập tin không được xử lý trước. ifndef/define/endifyêu cầu tiền xử lý bằng mọi cách, bởi vì sau khối này, bạn có thể có một cái gì đó có thể biên dịch được (về mặt lý thuyết)
Andrey

13
Tài liệu GCC về tối ưu hóa macro bảo vệ: gcc.gnu.org/onlinesocs/cppi INTERNals / Guard
Adrian

38
Để sử dụng bao gồm các vệ sĩ, có một yêu cầu bổ sung là bạn phải xác định một biểu tượng mới #ifndef FOO_BAR_H, như thông thường đối với một tệp như "foo_bar.h". Nếu sau này bạn đổi tên tệp này, bạn có nên điều chỉnh các bộ bảo vệ phù hợp để phù hợp với quy ước này không? Ngoài ra, nếu bạn có hai foo_bar.h riêng biệt ở hai vị trí khác nhau trong cây mã của bạn, bạn phải nghĩ ra hai biểu tượng khác nhau cho mỗi biểu tượng. Câu trả lời ngắn gọn là sử dụng #pragma oncevà nếu bạn thực sự cần biên dịch trong một môi trường không hỗ trợ nó, thì hãy tiếp tục và thêm các vệ sĩ cho môi trường đó.
Brandin

329

#pragma once có một nhược điểm (không phải là không chuẩn) và đó là nếu bạn có cùng một tệp ở các vị trí khác nhau (chúng tôi có điều này vì hệ thống xây dựng của chúng tôi sao chép các tệp xung quanh) thì trình biên dịch sẽ nghĩ đây là các tệp khác nhau.


36
Nhưng bạn cũng có thể có hai tệp có cùng tên ở các vị trí khác nhau mà không phải bận tâm đến việc tạo #define Nnam khác nhau, đó là iften dưới dạng HEADERFILENAME_H
Vargas

69
Bạn cũng có thể có hai hoặc nhiều tệp có cùng #define WHATEVER, điều này không gây ra sự kết thúc thú vị, đó là lý do tôi muốn sử dụng pragma một lần.
Chris Huang-Leaver

107
Không thuyết phục ... Thay đổi hệ thống xây dựng thành một hệ thống không sao chép các tệp xung quanh mà thay vào đó sử dụng các liên kết tượng trưng hoặc chỉ bao gồm cùng một tệp từ một vị trí trong mỗi đơn vị dịch. Âm thanh giống như cơ sở hạ tầng của bạn là một mớ hỗn độn phải được tổ chức lại.
Yakov Galka

3
Và nếu bạn có các tệp khác nhau có cùng tên trên các thư mục khác nhau, cách tiếp cận #ifdef sẽ nghĩ rằng chúng là cùng một tệp. Vì vậy, có một nhược điểm cho một, và có một nhược điểm cho người khác.
rxantos

3
@rxantos, nếu các tệp khác nhau, #ifdefgiá trị macro cũng có thể khác nhau.
Motti

63

Tôi ước #pragma once(hoặc một cái gì đó giống như nó) đã được trong tiêu chuẩn. Bao gồm những người bảo vệ không phải là một vấn đề lớn thực sự (nhưng họ có vẻ hơi khó giải thích với những người học ngôn ngữ), nhưng có vẻ như đó là một phiền toái nhỏ có thể tránh được.

Trong thực tế, vì 99,98% thời gian, #pragma oncehành vi là hành vi mong muốn, sẽ rất tuyệt nếu việc ngăn chặn nhiều tiêu đề được trình biên dịch tự động xử lý, với một #pragmahoặc một cái gì đó cho phép nhân đôi.

Nhưng chúng tôi có những gì chúng tôi có (ngoại trừ việc bạn có thể không có #pragma once).


48
Những gì tôi thực sự muốn là một #importchỉ thị tiêu chuẩn .
Giăng

10
Một chỉ thị nhập khẩu tiêu chuẩn đang đến: isocpp.org/blog/2012/11/ Khăn Nhưng chưa có ở đây. Tôi rất ủng hộ nó.
AHelps

6
@AHelps Vaporware. Đã gần năm năm rồi. Có thể vào năm 2023, bạn sẽ quay lại bình luận này và nói "Tôi đã nói với bạn như vậy".
doug65536

Nó không phải là phần mềm bay hơi, nhưng nó chỉ ở giai đoạn Đặc tả kỹ thuật. Các mô-đun được triển khai trong Visual Studio 2015 ( blog.msdn.microsoft.com/vcblog/2015/12/03/iêu ) và trong clang ( clang.llvm.org/docs/Modules.html ). Và đó là nhập khẩu, không phải #import.
AHelps

Nên biến nó thành C ++ 20.
Ionoclast Brigham

36

Tôi không biết về bất kỳ lợi ích hiệu suất nhưng nó chắc chắn hoạt động. Tôi sử dụng nó trong tất cả các dự án C ++ của mình (được cho là tôi đang sử dụng trình biên dịch MS). Tôi thấy nó hiệu quả hơn việc sử dụng

#ifndef HEADERNAME_H
#define HEADERNAME_H
...
#endif

Nó thực hiện cùng một công việc và không điền vào bộ tiền xử lý với các macro bổ sung.

GCC hỗ trợ #pragma oncechính thức kể từ phiên bản 3.4 .


25

GCC hỗ trợ #pragma oncetừ 3,4, xem http://en.wikipedia.org/wiki/Pragma_once để được hỗ trợ thêm về trình biên dịch.

Ưu điểm lớn mà tôi thấy khi sử dụng #pragma oncetrái ngược với các vệ sĩ là tránh các lỗi sao chép / dán.

Hãy đối mặt với nó: hầu hết chúng ta hầu như không bắt đầu một tệp tiêu đề mới từ đầu, mà chỉ cần sao chép một tệp hiện có và sửa đổi nó theo nhu cầu của chúng ta. Việc tạo một mẫu làm việc bằng cách sử dụng #pragma oncethay vì bao gồm các vệ sĩ sẽ dễ dàng hơn nhiều . Tôi càng ít phải sửa đổi mẫu, tôi càng ít có khả năng gặp lỗi. Có cùng một bảo vệ bao gồm các tệp khác nhau dẫn đến các lỗi biên dịch lạ và phải mất một thời gian để tìm ra lỗi sai.

TL; DR: #pragma oncedễ sử dụng hơn.


11

Tôi sử dụng nó và tôi hài lòng với nó, vì tôi phải gõ ít hơn nhiều để tạo một tiêu đề mới. Nó hoạt động tốt với tôi trong ba nền tảng: Windows, Mac và Linux.

Tôi không có bất kỳ thông tin hiệu suất nào nhưng tôi tin rằng sự khác biệt giữa #pragma và người bảo vệ đi kèm sẽ không là gì so với sự chậm chạp trong việc phân tích ngữ pháp C ++. Đó là vấn đề thực sự. Ví dụ, hãy thử biên dịch cùng số lượng tệp và dòng với trình biên dịch C #, để thấy sự khác biệt.

Cuối cùng, sử dụng người bảo vệ hoặc pragma, sẽ không thành vấn đề.


Tôi không thích #pragma một lần, nhưng tôi đánh giá cao việc bạn chỉ ra những lợi ích tương đối ... Phân tích cú pháp C ++ đắt hơn nhiều so với mọi thứ khác, trong môi trường hoạt động "bình thường". Không ai biên dịch từ hệ thống tệp từ xa nếu thời gian biên dịch là một vấn đề.
Tom

1
Re C ++ phân tích cú pháp chậm so với C #. Trong C #, bạn không phải phân tích (theo nghĩa đen) hàng ngàn LỘC tệp tiêu đề (iostream, bất cứ ai?) Cho mỗi tệp C ++ nhỏ. Tuy nhiên, hãy sử dụng các tiêu đề được biên dịch trước để làm cho vấn đề này nhỏ hơn
Eli Bendersky

11

Sử dụng ' #pragma once' có thể không có bất kỳ ảnh hưởng nào (nó không được hỗ trợ ở mọi nơi - mặc dù nó ngày càng được hỗ trợ rộng rãi), vì vậy dù sao bạn cũng cần sử dụng mã biên dịch có điều kiện, trong trường hợp nào, tại sao phải bận tâm với ' #pragma once'? Trình biên dịch có thể tối ưu hóa nó anyway. Nó phụ thuộc vào nền tảng mục tiêu của bạn, mặc dù. Nếu tất cả các mục tiêu của bạn hỗ trợ nó, thì hãy tiếp tục và sử dụng nó - nhưng đó là một quyết định có ý thức bởi vì tất cả địa ngục sẽ vỡ ra nếu bạn chỉ sử dụng pragma và sau đó chuyển sang trình biên dịch không hỗ trợ nó.


1
Tôi không đồng ý rằng dù sao bạn cũng phải hỗ trợ lính canh. Nếu bạn sử dụng #pragma một lần (hoặc lính canh) thì điều này là do nó gây ra một số xung đột mà không có chúng. Vì vậy, nếu nó không được hỗ trợ bởi công cụ chuỗi của bạn, dự án sẽ không biên dịch và bạn hoàn toàn ở trong tình huống tương tự như khi bạn muốn biên dịch một số ansi C trên trình biên dịch K & R cũ. Bạn chỉ cần nhận được một bản cập nhật mới hơn hoặc thay đổi mã để thêm một số vệ sĩ. Tất cả phá vỡ địa ngục sẽ là nếu chương trình được biên dịch nhưng không hoạt động.
kriss

5

Lợi ích về hiệu suất là từ việc không phải mở lại tệp sau khi đã đọc #pragma. Với những người bảo vệ, trình biên dịch phải mở tệp (có thể tốn kém về thời gian) để có được thông tin không nên đưa lại nội dung của nó.

Đó chỉ là lý thuyết vì một số trình biên dịch sẽ tự động không mở các tệp không có bất kỳ mã đọc nào trong mỗi đơn vị biên dịch.

Dù sao, đó không phải là trường hợp của tất cả các trình biên dịch, vì vậy lý tưởng nhất là #pragma một lần phải tránh đối với mã đa nền tảng vì nó không chuẩn chút nào / không có định nghĩa và hiệu ứng chuẩn. Tuy nhiên, trên thực tế, nó thực sự tốt hơn những người bảo vệ.

Cuối cùng, gợi ý tốt hơn bạn có thể đảm bảo có tốc độ tốt nhất từ ​​trình biên dịch của mình mà không phải kiểm tra hành vi của từng trình biên dịch trong trường hợp này, là sử dụng cả pragma một lần và bộ bảo vệ.

#ifndef NR_TEST_H
#define NR_TEST_H
#pragma once

#include "Thing.h"

namespace MyApp
{
 // ...
}

#endif

Bằng cách đó bạn sẽ có được thứ tốt nhất của cả hai (đa nền tảng và giúp tốc độ biên dịch).

Vì nó dài hơn để gõ, cá nhân tôi sử dụng một công cụ để giúp tạo ra tất cả những thứ đó theo một cách rất bấc (Visual Assistant X).


Visual Studio không tối ưu hóa #incoide Guard như hiện tại? Trình biên dịch khác (tốt hơn?) Làm như vậy, và tôi tưởng tượng nó khá dễ dàng.
Tom

1
Tại sao bạn đặt pragmasau ifndef? Có lợi ích gì không?
dùng1095108

1
@ user1095108 Một số trình biên dịch sẽ sử dụng các bộ bảo vệ tiêu đề làm dấu phân cách để biết liệu tệp chỉ chứa mã phải được khởi tạo một lần. Nếu một số mã nằm ngoài các bộ bảo vệ tiêu đề, thì toàn bộ tệp có thể được coi là có thể khả thi hơn một lần. Nếu cùng một trình biên dịch không hỗ trợ pragma một lần, thì nó sẽ bỏ qua hướng dẫn đó. Do đó, đặt pragma một lần vào bên trong các bộ bảo vệ tiêu đề là cách chung nhất để đảm bảo rằng ít nhất các bộ bảo vệ tiêu đề có thể được "tối ưu hóa".
Klaim

4

Không phải lúc nào.

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52566 đã một ví dụ tốt đẹp của hai tập tin có nghĩa là để cả hai được bao gồm, nhưng nhầm tưởng là giống hệt nhau vì timestamps giống hệt nhau và nội dung (không phải tên tập tin giống hệt nhau) .


10
Đó sẽ là một lỗi trong trình biên dịch. (cố gắng đi đường tắt không nên dùng).
rxantos

4
#pragma oncelà không chuẩn, do đó, bất cứ điều gì trình biên dịch quyết định làm là "chính xác". Tất nhiên, sau đó chúng ta có thể bắt đầu nói về những gì "mong đợi" và những gì "hữu ích".
dùng7610

2

Sử dụng gcc 3.4 và 4.1 trên các cây rất lớn (đôi khi sử dụng distcc ), tôi vẫn chưa thấy tăng tốc khi sử dụng #pragma một lần thay cho hoặc kết hợp với các vệ sĩ tiêu chuẩn.

Tôi thực sự không thấy giá trị của nó có thể gây nhầm lẫn với các phiên bản cũ của gcc, hoặc thậm chí các trình biên dịch khác vì không có tiền tiết kiệm thực sự. Tôi đã không thử tất cả các loại thuốc nhuộm khác nhau, nhưng tôi sẵn sàng cá rằng nó sẽ khiến nhiều người trong số họ bối rối.

Tôi cũng mong muốn nó đã được thông qua sớm, nhưng tôi có thể thấy lập luận "Tại sao chúng ta cần điều đó khi ifndef hoạt động hoàn toàn tốt?". Với nhiều góc tối và sự phức tạp của C, bao gồm lính canh là một trong những điều dễ giải thích nhất. Nếu bạn thậm chí có một kiến ​​thức nhỏ về cách thức hoạt động của bộ tiền xử lý, thì chúng nên tự giải thích.

Tuy nhiên, nếu bạn quan sát thấy tốc độ tăng đáng kể, vui lòng cập nhật câu hỏi của bạn.


2

Ngày nay, trường học cũ bao gồm những người bảo vệ nhanh như một #pragma. Ngay cả khi trình biên dịch không xử lý chúng đặc biệt, nó vẫn sẽ dừng khi thấy #ifndef WHATEVER và WHATEVER được xác định. Mở một tập tin là bụi bẩn giá rẻ ngày hôm nay. Ngay cả khi có một sự cải tiến, nó sẽ theo thứ tự là miliseconds.

Tôi chỉ đơn giản là không sử dụng #pragma một lần, vì nó không có lợi ích gì. Để tránh xung đột với những người bảo vệ khác, tôi sử dụng một số thứ như: CI_APP_MODULE_FILE_H -> CI = Tên viết tắt của công ty; APP = Tên ứng dụng; phần còn lại là tự giải thích.


19
Không phải là lợi ích mà nó ít gõ hơn?
Andrey

1
Tuy nhiên, xin lưu ý rằng một số phần nghìn giây một trăm nghìn lần là một vài phút. Các dự án lớn bao gồm mười nghìn tệp bao gồm hàng chục tiêu đề mỗi tệp. Với các CPU nhiều lõi hiện nay, đầu vào / đầu ra, đặc biệt là mở nhiều tệp nhỏ , là một trong những điểm nghẽn chính.
Damon

1
"Ngày nay, trường học cũ bao gồm những người bảo vệ nhanh như một #pragma một lần." Ngày nay, và cũng nhiều năm trước. Các tài liệu lâu đời nhất trên trang GCC là 2,95 từ năm 2001 và tối ưu hóa bao gồm các vệ sĩ không phải là mới sau đó. Nó không phải là một tối ưu hóa gần đây.
Jonathan Wakely 17/03/2015

4
Lợi ích chính là bao gồm các vệ sĩ dễ bị lỗi và dài dòng. Thật quá dễ dàng để có hai tệp khác nhau có tên giống nhau trong các thư mục khác nhau (và các bộ bảo vệ bao gồm có thể là cùng một biểu tượng) hoặc để xảy ra lỗi sao chép-dán trong khi sao chép bao gồm các bộ bảo vệ. Thực tế một lần là ít bị lỗi và hoạt động trên tất cả các nền tảng PC chính. Nếu bạn có thể sử dụng nó, đó là phong cách tốt hơn.
AHelps

2

Sự khác biệt chính là trình biên dịch phải mở tệp tiêu đề để đọc bảo vệ bao gồm. Để so sánh, pragma một lần khiến trình biên dịch theo dõi tệp và không thực hiện bất kỳ tệp IO nào khi nó đi qua một tệp khác bao gồm cùng một tệp. Trong khi điều đó nghe có vẻ không đáng kể, nó có thể dễ dàng mở rộng quy mô với các dự án lớn, đặc biệt là những dự án không có tiêu đề tốt bao gồm các nguyên tắc.

Điều đó nói rằng, ngày nay các trình biên dịch (bao gồm GCC) đủ thông minh để xử lý bao gồm các vệ sĩ như pragma một lần. tức là họ không mở tệp và tránh bị phạt IO.

Trong các trình biên dịch không hỗ trợ pragma Tôi đã thấy các triển khai thủ công hơi cồng kềnh ..

#ifdef FOO_H
#include "foo.h"
#endif

Cá nhân tôi thích #pragma một lần tiếp cận vì nó tránh được rắc rối khi đặt tên va chạm và lỗi chính tả tiềm ẩn. Nó cũng là mã thanh lịch hơn bằng cách so sánh. Điều đó nói rằng, đối với mã di động, không nên có cả hai trừ khi trình biên dịch phàn nàn về nó.


1
"Điều đó nói rằng, những ngày này trình biên dịch (bao gồm GCC) đủ thông minh để điều trị bao gồm những người bảo vệ như pragma một lần." Họ đã làm điều đó trong nhiều thập kỷ, có thể lâu hơn #pragma onceđã tồn tại!
Jonathan Wakely 17/03/2015

Nghĩ rằng bạn hiểu lầm tôi. Tôi muốn nói trước khi pragma một lần, tất cả các trình biên dịch sẽ phải chịu nhiều hình phạt IO cho cùng một tệp h bao gồm nhiều lần trong giai đoạn tiền xử lý. Việc triển khai hiện đại kết thúc bằng cách sử dụng bộ đệm ẩn tốt hơn của các tệp trong giai đoạn tiền xử lý. Bất kể, không có pragma, giai đoạn tiền xử lý kết thúc vẫn bao gồm tất cả mọi thứ bên ngoài bao gồm các vệ sĩ. Với pragma một lần, toàn bộ tập tin bị bỏ lại. Từ quan điểm đó, pragma vẫn là lợi thế.
Shammi

1
Không, đó là sai, các trình biên dịch đàng hoàng bỏ toàn bộ tệp ngay cả khi không có #pragma một lần, họ không mở tệp lần thứ hai và thậm chí họ không nhìn vào nó lần thứ hai, xem gcc.gnu.org/onlinesocs/ cpp / Again-Only-Headers.html (điều này không liên quan gì đến bộ nhớ đệm).
Jonathan Wakely

1
Từ liên kết của bạn, có vẻ như việc tối ưu hóa chỉ xảy ra trong cpp. Bất kể, bộ nhớ đệm đi vào chơi. Làm thế nào để bộ tiền xử lý biết bao gồm mã bên ngoài các bộ bảo vệ. Ví dụ ... extern int foo; #ifndef INC_GUARD #define INC_GUARD lớp ClassInHeader {}; #endif Trong trường hợp này, bộ tiền xử lý sẽ phải bao gồm extern int foo; nhiều lần nếu bạn bao gồm cùng một tệp nhiều lần. Cuối ngày, không có nhiều tranh cãi về vấn đề này miễn là chúng ta hiểu được sự khác biệt giữa #pragma một lần và bao gồm các vệ sĩ và cách các trình biên dịch khác nhau cư xử với cả hai :)
Shammi

1
Nó không áp dụng tối ưu hóa trong đó, rõ ràng.
Jonathan Wakely

1

Nếu chúng tôi sử dụng msvc hoặc Qt (tối đa Qt 4.5), vì GCC (tối đa 3,4), msvc đều hỗ trợ #pragma once, tôi có thể thấy không có lý do gì để không sử dụng #pragma once.

Tên tệp nguồn thường giống với tên lớp bằng nhau và chúng tôi biết, đôi khi chúng tôi cần tái cấu trúc , để đổi tên tên lớp, sau đó chúng tôi phải thay đổi #include XXXX, vì vậy tôi nghĩ rằng việc duy trì thủ công #include xxxxxkhông phải là một công việc thông minh. ngay cả với tiện ích mở rộng Visual Assistant X, việc duy trì "xxxx" không phải là công việc cần thiết.


1

Lưu ý thêm cho những người nghĩ rằng việc bao gồm các tệp tiêu đề chỉ một lần tự động luôn luôn được mong muốn: Tôi xây dựng các trình tạo mã bằng cách sử dụng hai hoặc nhiều lần bao gồm các tệp tiêu đề trong nhiều thập kỷ. Đặc biệt đối với việc tạo các thư viện giao thức, tôi thấy rất thoải mái khi có một trình tạo mã cực kỳ di động và mạnh mẽ mà không cần thêm các công cụ và ngôn ngữ. Tôi không phải là nhà phát triển duy nhất sử dụng lược đồ này như blog X-Macros này hiển thị. Điều này sẽ không thể làm được nếu không có bảo vệ tự động bị mất.


Các mẫu C ++ có thể giải quyết vấn đề không? Tôi hiếm khi tìm thấy bất kỳ nhu cầu hợp lệ nào cho các macro vì cách các mẫu C ++.
Rõ ràng hơn

1
Kinh nghiệm chuyên môn lâu dài của chúng tôi là việc sử dụng cơ sở hạ tầng ngôn ngữ, phần mềm và công cụ trưởng thành mọi lúc mang lại cho chúng tôi là nhà cung cấp dịch vụ (Hệ thống nhúng) một lợi thế rất lớn về năng suất và tính linh hoạt. Các đối thủ cạnh tranh phát triển phần mềm và hệ thống nhúng dựa trên C ++ thay vào đó có thể thấy một số nhà phát triển của họ hài lòng hơn trong công việc. Nhưng chúng tôi thường vượt trội so với thời gian tiếp thị, chức năng và tính linh hoạt nhiều lần. Nether đánh giá thấp năng suất tăng từ việc sử dụng một và cùng một công cụ nhiều lần. Thay vào đó, các nhà phát triển web phải chịu nhiều cách đối với nhiều Khung.
Marcel

Mặc dù vậy, một lưu ý: không bao gồm các vệ sĩ / # pragma một lần trong mỗi tệp tiêu đề chống lại chính nguyên tắc DRY. Tôi có thể thấy quan điểm của bạn trong X-Macrotính năng này, nhưng nó không phải là mục đích sử dụng chính, không phải là cách khác như tiêu đề unguard / # pragma multi nếu chúng ta gắn bó với DRY?
caiohamamura

DRY là viết tắt của "Đừng lặp lại BẢN THÂN". Đó là về con người. Những gì máy móc đang làm, không có gì để làm với mô hình đó. Các mẫu C ++ lặp lại rất nhiều, trình biên dịch C cũng làm điều đó (ví dụ như không kiểm soát vòng lặp) và mọi Máy tính đều lặp lại gần như mọi thứ không thể tin được thường xuyên và nhanh chóng.
Marcel
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.