2014-06-14 29 views
10

yılında "div" ilan edemez. Nasıl geçersiz kılabilirim? ya da herhangi bir çözüm var mı?aşağıdaki gibi temel matematik işlemleri ile enum beyan etmek istiyorum enum

error: ‘div’ redeclared as different kind of symbol /usr/include/stdlib.h:158: error: previous declaration of ‘div_t div(int, int)’

+0

Evet, benim yorumuma değişti. –

+0

Bu, C++ ayrılmış bir anahtar sözcük değil, numaralı belgede bildirilen bir işlev tanımlayıcısıdır. Div_ veya Div gibi başka bir ad seçin. # Div div div_de, ancak bunu yaparak div işlevine erişemezsiniz. –

cevap

22

div bir anahtar kelime değil, daha ziyade standart bir kütüphane işlevi, stdlib.h beyan ve muhtemelen cstdlib yılında: Burada

hata mesajıdır.

En basit çözüm, farklı tanımlayıcıları kullanmaktır. divcstdlib bildirilen bir işlev ve ismi olduğu için

enum class Operations 
{ 
    div, 
    mul, 
    add, 
    sub 
}; 

Bu Operations kapsam (Operations::div, Operations::mul vs.)

6

enum değerlerini koyacağız: Aksi takdirde, kapsamlı numaralandırma kullanabilir Küresel olmayan bir numaralandırma global olarak ihmal edilebilir. Bu, 'un numaralandırma olarakdiv kullanamayacağınız anlamına gelir. C++ 11'de

, kapsamlı numaralandırma bu duruma

enum class Operations 
{ 
    div, 
    mul, 
    add, 
    sub 
}; 

için tanıtıldı ve daha sonra yeni bir ad oluşturabilirsiniz Operations::div

2

kullanabilirsiniz:

#include <stdlib.h> 

namespace a 
{ 
    enum Operations 
    { 
     div, 
     mul, 
     add, 
     sub 
    }; 
} 

int main() 
{ 
    a::div; 
    return 0; 
} 
+1

girinti mi? Sekmeler yerine boşlukları kullanmanızı öneriyorum. –

+1

, çoğu kod düzenleyicide –

0

kullanın cstdlib değil, C++ 'da stdlib.h. Ve std ad alanını global ad alanına almayın (yani, using namespace std'u kullanmayın). Sonra, enum ile çarpışmak için global ad alanında bir div olmayacaktır.

+0

bir sekme-alan dönüşümü var. Fark etmez. Ne yazık ki, 'cstdlib' et al, isimleri global ad alanına getirebilir. Bu kötü, ama öyle. – juanchopanza

+0

@juanchopanza: Evet, sanırım uygulamada olduğunu fark ettim. Kötü, ben daha da güçlü diyebilirim, bu şeyleri ilk başta 'std' isim alanına koymak tamamen imha eder. Evet, isterseniz std :: div' e bakabilirsiniz. Ama yine de, programda yer almayan herhangi bir tanımlayıcıyı (örneğin, bir sınıfın adı veya bir ad alanının adı olarak), bazı (yinelemeli?) Dahil edilen başlık dosyası tarafından tüm dünyada tanıtılabilecek herhangi bir adla çakışmamasını denetlemeden güvenli şekilde kullanamazsınız. –

+0

@MarcvanLeeuwen Önceden C++ 11 "kötü davranış" olarak kullanılır ve bu yana izin verilir. Ancak, yalnızca C standart kitaplığındaki 'birşeyler 'eşdeğerleriyle' csomething 'başlıkları için geçerli olduğuna dikkat edin. Adların çoğu eski ve iyi bilinir ve C++ standart kitaplığından çok daha azdır. – juanchopanza