2013-08-15 43 views
8

Tôi có tệp tiêu đề mà tôi đang cố đưa vào từ tệp nguồn khác bằng cách sử dụng thư mục pre-processor include. Tôi đã cố gắng sử dụng cả hai hình thức trích dẫn cũng như hình thức góc-braket, nhưng dường như không làm công việc.Cách đưa tệp vào C và/hoặc C++

Tên tệp là .>"hello.h và thư mục nơi trình biên dịch tìm kiếm. Tôi đã cố gắng để bao gồm nó như thế này:

  • #include <.>"hello.h>
  • #include <.\>"hello.h>
  • #include <.\>\"hello.h>
  • #include ".>"hello.h"
  • #include ".>\"hello.h"

Tôi cũng đã cố gắng khác nhau C và C++ biên dịch - kêu vang , gcc , clang ++ và g ++.

Rõ ràng, không có cách nào ở trên hoạt động hoặc không có câu hỏi nào.

Tôi nghĩ rằng có thể tên không hợp pháp theo tiêu chuẩn. Thật không may, tôi không có thông số kỹ thuật tiêu chuẩn C cũng như C++. Nguồn thông tin có thẩm quyền duy nhất tôi có thể tìm thấy là this MSDN trang về chỉ thị #include và tài liệu preprocessor GNU C, here. Tài liệu của GNU không nói nhiều, MSDN có các điều khoản sau, tuy nhiên:

Đường dẫn-spec là tên tệp tùy chọn trước bởi một thư mục đặc điểm kỹ thuật. Tên tệp phải đặt tên tệp hiện có. Cú pháp của đường dẫn-spec phụ thuộc vào hệ điều hành mà chương trình được biên dịch .

Tôi tò mò muốn biết các tiêu chuẩn C và C++ nói gì về điều này?

Tôi tìm các quy tắc dành riêng cho hệ điều hành này cho các yêu cầu đặt tên tệp tiêu đề C và C++? Tôi đặc biệt quan tâm đến OS X, Linux và FreeBSD.

Tại sao thoát < và/hoặc " ký tự không hoạt động?

Làm cách nào để bao gồm tệp của tôi?

+0

Bạn đang biên dịch bằng cách sử dụng 'clang file_one.c file_two.c'? ... có thể dễ dàng là vấn đề. Không chắc chắn những gì bạn đang cố gắng đạt được ở đây. –

+4

Tôi biết nó không trả lời câu hỏi, nhưng tại sao không .... đổi tên tập tin? Đó là tên khủng khiếp anyway. – eli

+0

@JacobPollack: Tôi đang biên dịch thành 'clang ++ -Wall -pedantic -I. -std = C++ 11 -stdlib = libC++ -o hello./hello.cc' trong đó 'hello.cc' là một tập tin mà tôi cần bao gồm'.> "hello.h' từ. –

Trả lời

10

Tôi nghĩ rằng bạn đang trên may mắn với tên tập tin từ draft C99 standard phần 6.4.7 Header names ngữ pháp là như sau:

header-name: 
    < h-char-sequence > 
    " q-char-sequence " 
h-char-sequence: 
    h-char 
    h-char-sequence h-char 
h-char: 
    any member of the source character set except 
    the new-line character and > 
q-char-sequence: 
    q-char 
    q-char-sequence q-char 
q-char: 
    any member of the source character set except 
    the new-line character and " 

Bạn có cả một "> trong tên tập tin mà không bao gồm các bạn từ cả hai q-charh-char đặc điểm kỹ thuật. Tôi không nghĩ rằng bạn có nhiều sự lựa chọn, nhưng để thay đổi tên tập tin.

Ngữ pháp giống nhau trong phần draft C++ standard, phần 2.9 Header names.

+0

Cảm ơn. Tôi đánh giá cao bạn trích dẫn tiêu chuẩn. Bất kỳ thay đổi bạn có một báo giá cho C + + là tốt? –

+0

@VladLazarenko Tôi đang tìm kiếm C++ nhưng tôi khá chắc chắn nó là tương tự. –

+1

@ShafikYaghmour: Đó là trong C++ 11 2.9, và từ ngữ thực tế giống như C99. –

2

"và> không phải là ký tự hợp lệ cho tên tệp trong Windows. Tên tệp của bạn phải là hello.h hoặc. \ Hello.h hoặc .. \ hello.h, nhưng không.>" Hello.h.

#include "hello.h" 
#include ".\hello.h" 
#include "..\hello.h" 
#include "c:/temp/hello.h" 

Đó là lý do tại sao bạn sẽ không tìm thấy bất kỳ điều gì trong MSDN về nó.

ext3 cho phép hầu hết các ký tự (một số phải được thoát khi được sử dụng), nhưng bạn nên sử dụng chúng khi đặt tên cho tệp tiêu đề và tệp nguồn của bạn (nếu không có lý do nào khác ngoài khả năng đọc).Để biết thêm thông tin: http://pic.dhe.ibm.com/infocenter/compbg/v121v141/index.jsp?topic=%2Fcom.ibm.xlcpp121.bg.doc%2Flanguage_ref%2Fc99preprocessor.html

+0

Điều này trả lời câu hỏi cho Windows. Tôi đang sử dụng OS X, tuy nhiên, và tôi nghĩ rằng tên tập tin là hợp pháp vì nó tồn tại và tôi có thể mở nó để đọc. –

+0

Mặc dù câu hỏi cho biết "Tôi đặc biệt quan tâm đến OS X, Linux và FreeBSD", không chia sẻ các hạn chế của Windows. –

+3

Tôi sẽ _not_ đặt dấu gạch chéo ngược vào tên. Ngay cả trong Windows, '#include" ../ hello.h "' là an toàn hơn rất nhiều. –

5

Trong cả C và C++, đó không phải là tên tiêu đề hợp lệ vì nó chứa cả hai tên >".

Cú pháp cho tên tiêu đề cho phép những giới hạn bởi <> để chứa "bất kỳ thành viên của nhân vật nguồn thiết trừ mới-line và >", và những giới hạn bởi "" để chứa "bất kỳ thành viên của nhân vật nguồn thiết trừ mới- và " ". Không có khái niệm về một chuỗi thoát.

+0

Điểm tốt. '" ... "' trong một bao gồm không phải là một chuỗi chữ, và không tuân theo các quy tắc thông thường cho chuỗi ký tự. Mặt khác, tôi khá chắc chắn rằng thoát được cho phép (mặc dù có thể không cho "), và có những bối cảnh mà bạn có thể bắt đầu với một chuỗi chữ, và cuối cùng có nó được hiểu là một' "' q-char- sequence '' '. Tiêu chuẩn là bất cứ điều gì nhưng rõ ràng ở đây. –

+0

@JamesKanze: Tiêu chuẩn xác định rõ ràng ngữ pháp cho * tiêu đề * * - Câu trả lời của Shakif tái tạo nó đầy đủ. Thoát, hoặc bất kỳ cách nào khác để thay đổi định nghĩa * q-char * hoặc * h-char *, sẽ là phần mở rộng phi tiêu chuẩn –

+0

Tôi nghĩ quyền của bạn, nếu bạn sử dụng chuỗi q-char. Các ký tự khác có thể được thoát (vì cách diễn giải tên là thực hiện được xác định), nhưng không phải là '" '. Nhưng những gì về giải pháp tôi đề xuất với '#define NAME '.> \" Hello.h "', sau đó '#include NAME' Trong' # define', nó là một "token", và kiểu duy nhất của nó Tôi nghĩ tiêu chuẩn rất mơ hồ về điều này –

0

Tên tệp được chấp nhận là triển khai được xác định. Tôi đã mong đợi #include ".>\"hello.h" to work, at least on systems where '>' and '"'` là hợp pháp trong tên tệp, nhưng không yêu cầu nó hoạt động, và rõ ràng là hệ thống nơi nó sẽ không, vì tên như vậy không hợp pháp trong hệ thống .

bạn có thể thử buộc vấn đề:

#define NAME ".>\"hello.h" 
#include NAME 

nhưng đối với các mục đích thực tế, bạn nên hạn chế tên tập tin của bạn để chữ cái và số, gạch dưới, và có lẽ có dấu gạch nối (nhưng tôi muốn được Leary của những cũng). Và chỉ với một chấm, trước phần mở rộng . Nếu bạn tìm kiếm rắc rối, đừng ngạc nhiên nếu bạn tìm thấy nó.

Điều nào, tất nhiên, trả lời câu hỏi cuối cùng của bạn: làm cách nào để bao gồm tệp. Bạn đổi tên nó thành một cái gì đó hợp lý.

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