2011-04-06 34 views
10

Có phải #include <file> chỉ được sử dụng cho tiêu đề hoặc đơn giản là cơ khí "tiêm mã này ở đây" có thể được sử dụng ở bất kỳ đâu trong mã?#include ở bất cứ nơi nào

Nếu tôi sử dụng nó ở giữa hàm cpp để chỉ "tiêm" mã từ một nguồn duy nhất thì sao? sẽ làm việc này hoặc sẽ trình biên dịch hét lên về điều này?

+7

Tại sao bạn không thử và xem chính mình trước? – Nawaz

+0

..không gần trình biên dịch ngay bây giờ ... – JasonGenX

Trả lời

15

một cơ tiêm mã ở đây thiết bị. Bạn có thể bao gồm một tập tin văn bản có chứa Faust của Goethe nếu bạn muốn. Bạn có thể đặt nó ở bất cứ nơi nào, ngay cả ở giữa một chức năng (tất nhiên, #include cần một dòng mới!).

Tuy nhiên, đó là quy ước mạnh mẽ chỉ sử dụng #include cho tệp tiêu đề. Có thể có những lý do mà tôi sẽ không phản đối, ví dụ như kéo mã được tạo bằng máy hoặc hợp nhất tất cả các đơn vị dịch trong một tệp.

+9

Bạn có thể nhận được Goethe's Faust [tại đây] (http://www.gutenberg.org/ebooks/3023) dưới dạng bản tải xuống miễn phí;) – fredoverflow

+1

Bạn có thể đặt nó * gần như * bất cứ đâu. '# include' phải là mã thông báo tiền xử lý và phải là mã thông báo đầu tiên trên một dòng. Vì vậy, 'a #include c' trên một dòng sẽ không hoạt động. Không phải '# include' bên trong một chuỗi ký tự. –

1

Nên hoạt động, nó được xử lý bởi bộ tiền xử lý của bạn, trình biên dịch của bạn thậm chí sẽ không nhìn thấy nó.

6

Nó sẽ làm việc - nhiều hay ít ý nghĩa ngữ nghĩa của nó là: Mã vị trí trong tập tin đó đây

EDIT: Đối với lạm dụng tập quán của #include Tôi chỉ có thể khuyên bạn như sau:

#include "/dev/console" 

này cho phép cho tất cả mọi thứ: một lớp lót có thể làm tất cả mọi thứ, một lỗi, nó chỉ là vấn đề biên soạn ...

0

#include và các chỉ thị tiền xử lý khác như #define hoặC#import, có thể xuất hiện ở bất kỳ đâu trong nguồn, nhưng sẽ chỉ áp dụng cho mã sau khi bao gồm. Nó có nghĩa là bao gồm mã được tham chiếu vào tệp nguồn gọi nó. Trang MSDN này giải thích nó khá tốt. http://msdn.microsoft.com/en-us/library/36k2cdd4(v=VS.71).aspx

5

Trình biên dịch sẽ không phàn nàn, nhưng mọi người phải duy trì mã sẽ.

0

bao gồm được xử lý bởi bộ tiền xử lý và là cơ chế để chèn mã. Không có hạn chế về tệp được bao gồm hoặc nơi #include này được đặt trong mã của bạn (được cho là nằm trong dòng riêng của nó). Miễn là tệp được chỉ định có thể được tìm thấy bởi bộ tiền xử lý, nó sẽ nhập nội dung của nó vào tệp hiện tại.

Thông thường bạn làm điều này cho tệp tiêu đề. Tôi đã nhìn thấy điều này được thực hiện với các tập tin cpp trong quá trình tạo mẫu (với #ifdef thích hợp để bạn không bao gồm nó nhiều lần gây ra nhiều lỗi định nghĩa biểu tượng).

Nếu bạn có thời lượng dài, bạn cũng có thể thực hiện việc này cho các loại tệp khác. (Mặc dù có nhiều cách xử lý các chuỗi dài hơn tốt hơn)

9

Nó không chỉ hoạt động ở bất cứ đâu, mà còn có thể dẫn đến một số kỹ thuật thú vị. Dưới đây là một ví dụ tạo ra một điều tra và một bảng chuỗi tương ứng được đảm bảo được đồng bộ.

Animals.h:

ANIMAL(Anteater) 
ANIMAL(Baboon) 
... 
ANIMAL(Zebra) 

AnimalLibrary.h:

#define ANIMAL(name) name, 

enum Animals { 
#include "Animals.h" 
     AnimalCount 
    }; 

#undef ANIMAL 

extern char * AnimalTable[AnimalCount]; 

AnimalLibrary.cpp:

#include "AnimalLibrary.h" 

#define ANIMAL(name) #name, 

char * AnimalTable[AnimalCount] = { 
#include "Animals.h" 
    }; 

main.cpp:

#include "AnimalLibrary.h" 

int main() 
{ 
    cout << AnimalTable[Baboon]; 
    return 0; 
} 

Hãy chắc chắn không để đưa thông thường bao gồm bảo vệ trong bất kỳ tập tin đó sẽ được bao gồm nhiều lần!

Phải đồng ý với William Pursell mặc dù kỹ thuật này sẽ khiến mọi người gãi đầu.

+0

Điều đó rất tuyệt! Đã cho tôi một số đầu gãi để tìm ra những gì đang xảy ra, nhưng có! – murftown

Các vấn đề liên quan