2010-07-27 20 views
6

Tôi có một C++ nộp như thế nàytrong C++, có gì đặc biệt về "_MOVE_H"?

#ifndef _MOVE_H 
#define _MOVE_H 

class Move { 
    int x, y; 
public: 
    Move(int initX = 0, int initY = 0) : x(initX), y(initY) {} 
    int getX() { return x; } 
    void setX(int newX) { x = newX; } 
    int getY() { return y; } 
    void setY(int newY) { y = newY; } 
}; 

#endif 

Và thật ngạc nhiên của tôi, tất cả các mã giữa #ifndef#endif chỉ đơn giản là bỏ qua bởi trình biên dịch (Tôi thề rằng tôi không xác định _MOVE_H bất cứ nơi nào khác), và tôi có tất cả các loại lỗi về định nghĩa thiếu. Tôi đã nghĩ rằng tôi đã làm điều gì sai, nhưng khi tôi cố gắng sử dụng một khóa khác (như _MOVE_Ha, mọi thứ trở lại bình thường. _MOVE_H có nghĩa là một cái gì đó đặc biệt trong C++?

Tôi đang chạy Ubuntu 10.04, GCC 4.4.3 , nếu có vấn đề

Cảm ơn,

+1

có thể là một trong các tệp thư viện bạn đang sử dụng để bảo vệ không? bạn đã kiểm tra điều đó chưa btw, tôi thường tiền tố nó với tên dự án để tránh chính xác loại vấn đề này. – Naveen

+0

Một lý do khác để sử dụng '#pragma once' thay vì' # define' bao gồm bảo vệ ... – Inverse

+4

@Inverse, '#pragma once' là một phần mở rộng của trình biên dịch và không được hỗ trợ bởi tất cả các trình biên dịch. Bao gồm các vệ sĩ là trình biên dịch an toàn duy nhất có nghĩa là ngăn chặn nhiều sự bao gồm. –

Trả lời

15

chỉ cần chạy grep _MOVE_H trong/usr/include/C++ trên máy tính của bạn

cho tôi:

c++/4.5.0/bits/move.h:#ifndef _MOVE_H 

Như một quy tắc của ngón tay cái, không sử dụng điều (thực sự bất cứ điều gì) tiền tố bởi _ hoặc __. Nó được dành riêng cho việc sử dụng nội bộ. Sử dụng SOMETHING_MOVE_H (thường là tên của công ty, ...).

Tôi đoán đó là tiêu đề mới được sử dụng để thêm ngữ nghĩa di chuyển vào C++ 0x.

+12

Để làm rõ quy tắc gạch dưới, mọi thứ sau đây được đặt trước: bất kỳ tên * global * nào được đặt trước bởi '_', bất kỳ tên nào của bất kỳ loại nào được đặt trước bởi' __', và bất kỳ tên nào của bất kỳ loại nào được bắt đầu bằng '_' và bắt đầu bằng một chữ hoa. Các OP chạy afoul của các quy tắc đầu tiên và thứ ba. –

+6

Bất kỳ tên nào có chứa '__' đều được đặt trước. Nó không cần tiền tố. –

0

đó là một thủ thuật để ngăn chặn các tập tin cùng một tiêu đề được bao gồm nhiều hơn một lần giá trị thực tế bạn #define không quan trọng -.. miễn là nó chỉ được định nghĩa trong tiêu đề tệp, quy ước là NAME_HEADER_FILE_H ở thủ đô

Xem thêm thảo luận này vào ngày #pragma once

+2

xin lỗi, đó không thực sự là vấn đề. vấn đề là, tập tin của tôi không được bao gồm cả. – phunehehe

+0

Xin lỗi không đọc chi tiết đủ chi tiết –

5

Bất kỳ điều gì bắt đầu bằng dấu gạch dưới thì chữ cái viết hoa được dành riêng cho việc triển khai. (ví dụ: _M). Tôi nghĩ rằng nói chung bạn muốn tránh xa những dấu gạch dưới hàng đầu.

4

Tôi tin gcc có tệp bao gồm tên là move.h bao gồm nội dung gửi _MOVE_H. Có lẽ bạn đã va chạm với điều này. Sử dụng số nhận dạng khác, tốt nhất là từ định danh không bắt đầu bằng dấu gạch dưới. Tôi đặt một GUID trong của tôi, nhưng sau đó tôi là thực sự ám ảnh :-)

+0

upvote cho guid! LOL! –

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