2010-12-13 18 views
6

Bir dizi işlev içeren bir dosyam var. İşlevlerden biri için temel olarak bir char * alan ve tüm boşlukları atlayan bir yardımcı işlev yazmak istiyorum.İsimsiz bir ad alanında işlev bildirimi koymak mümkün mü?

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) {} 
} 

Ama bu bana bir derleyici hata veriyor:

İşte bunun yapılması gerektiğini düşündük nasıl. Tanımı isimsiz isim alanına koymak zorunda mıyım? hemen using yönergesi tarafından takip benzersiz oluşturulan ada sahip bir ad ile değiştirildi sanki

+0

ayrıca nedeniyle SkipWhitespace tanımında bir yazım hatası bir hata alıyorsanız fonksiyonu 'hükümsüz SkipWhitespace (const char * & lar)' –

+0

yapmak isteyeceksiniz. Void olmalı SkipWhitespace (const char * s) – greatwolf

+0

Sadece yazılan kaynak bir yazım hatası oldu. – helpermethod

cevap

9

Şu ana kadar:

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) {} 
    } 
} 

Ama bir döngüsel bağımlılık olmadıkça, bu değeri ne olduğundan emin değilim. Sadece bir seferde işlevi bildirmek ve tanımlamak.

+5

, yani işlev B ayrıca kaynak kodunda işlev A izler. Java'da bu bir sorun değil ama C++ 'da onu tanımlamanın doğrudan yolu olduğunu düşünüyorum. – helpermethod

2

İsmi açıklanmayan ad davranır.

Bu fonksiyon bildirimi ad aslında bir adı vardı tam sanki bir ad alanına ait olduğu anlamına gelir. bir (a çeviri birimi isimsiz ad tüm oluşumları aynı ad başvurmak için kullanılabilir) tanımı yaklaşık namespace {} çevreleyen ya da eş zamanlı olarak bildirmek ve işlev tanımlamak veya ekleyin: Bunun gibi, tanımı aynı ad yaşayan gerekir. yanı anonim ad tanımlamak için

namespace { 

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

} 
1

Muhtemelen de bu konuyu görmek gerekir:

BTW

Superiority of unnamed namespace over static?

, neden bu işlevi:

void SkipWhitespace(const char *s); 

Neden bu:

void SkipWhitespace(std::string &s); 

??

+0

Sry Std :: string sınıfının kullanılmasının yasak olduğu bir ev ödevi olduğundan bahsetmedim. – helpermethod

+1

@Helper lol, std :: string ile bir C++ ataması yasaklandı. Tabii ki, bazı eğlenceli kurslar var ... – stefaanv

+2

Evet, ne yazık ki dil bilen o garip C/C++ kursu :-(. – helpermethod

İlgili konular