2010-12-13 32 views
6

Tôi có một tập tin với một tập hợp các chức năng. Đối với một trong các hàm, tôi muốn viết một hàm trợ giúp về cơ bản lấy một char * và bỏ qua tất cả các khoảng trắng.Có thể đặt một khai báo hàm trong một không gian tên chưa được đặt tên không?

Đây là cách tôi nghĩ rằng nó nên được thực hiện:

namespace { 
    const int kNotFound = -1; 

    void SkipWhitespace(const char *s); // forward declaration - doesn't seem to work? 
} 

void foo(const char *s1, const char *s2) { 
    // do some stuff 

    SkipWhitespace(s1); 
    SkipWhitespace(s2); 

    // continue with other stuff 
} 

void SkipWhitespace(const char *s) { 
    for (; !isspace(s); ++s) {} 
} 

Nhưng điều này mang lại cho tôi một lỗi biên dịch. Tôi có cần phải đặt định nghĩa trong không gian tên không tên?

+0

bạn cũng sẽ muốn thực hiện chức năng 'void SkipWhitespace (const char * & s)' –

+0

bạn đang gặp phải lỗi do lỗi đánh máy trong định nghĩa SkipWhitespace. Nên bỏ trống SkipWhitespace (const char * s) – greatwolf

+0

Chỉ là một lỗi đánh máy trong nguồn được đăng. – helpermethod

Trả lời

9

Bạn cần phải xác định nó trong không gian tên vô danh cũng như:

namespace { 
    ... 
    void SkipWhitespace(const char *s); // forward declaration - doesn't seem to work? 
} 

void foo(const char *s1, const char *s2) { 
    ... 
} 

namespace { 
    void SkipWhitespace(const char s*) { 
     for (; !isspace(s); ++s) {} 
    } 
} 

Nhưng trừ khi có một sự phụ thuộc theo chu kỳ, tôi không chắc chắn những gì giá trị của việc này là. Chỉ cần khai báo và xác định hàm trong một lần.

+5

Tôi thích khi bạn có thể đọc mã nguồn lộn ngược, tức là khi hàm A gọi hàm B, hàm B cũng theo hàm A trong mã nguồn. Trong Java điều này không có vấn đề gì nhưng tôi đoán trong C++ xác định nó trực tiếp là con đường để đi. – helpermethod

2

Không gian tên chưa đặt tên hoạt động như thể nó được thay thế bằng không gian tên với tên được tạo duy nhất ngay sau đó là chỉ thị sử dụng.

Điều này có nghĩa là khai báo chức năng của bạn thuộc về không gian tên chính xác như thể không gian tên thực sự có tên. Như vậy, định nghĩa của nó phải sống trong cùng một không gian tên: đồng thời khai báo và xác định hàm, hoặc thêm namespace {} kèm theo định nghĩa (hoạt động vì tất cả các lần xuất hiện của không gian tên chưa đặt tên trong đơn vị dịch đều tham chiếu đến cùng một không gian tên).

namespace { 

void SkipWhitespace(const char s*) { 
    for (; !isspace(s); ++s) {} 
} 

} 
1

Bạn có thể cần phải xem chủ đề này cũng như:

Superiority of unnamed namespace over static?

BTW, tại sao chức năng này:

void SkipWhitespace(const char *s); 

Tại sao không này:

void SkipWhitespace(std::string &s); 

??

+0

Sry Tôi đã không đề cập rằng đó là một bài tập về nhà, nơi sử dụng std :: string class bị cấm. – helpermethod

+1

@ Hilel lol, một bài tập C++ với std :: string banned. Rõ ràng, bạn có một số khóa học thú vị ... – stefaanv

+2

Vâng, thật đáng buồn đó là một trong những khóa học C/C++ kỳ lạ mà bạn kết thúc không biết một trong hai ngôn ngữ :-( – helpermethod

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