Pergunta

Eu estava realmente incomodado com a inclusão de C stdlib funções no namespace global E acabou escrevendo coisas como :: snprintf ou :: errno ou struct :: stat, etc, para se diferenciar de algumas de minhas próprias funções no espaço para nome de anexos onde essas funções c stdlib foram usadas.

Então eu descobri que existe uma maneira de declarar todas as funções c stdlib no espaço de nome de std (como sTL): apenas inclua <c (lib)> em vez de <(lib) .h> Então, eu editei meu código o uso daqueles O novo "C for C ++" inclui.

Sobre Debian/GCC 4.3.4 Eu tive que 2 problemas:

1) #Error Este arquivo requer suporte ao compilador e biblioteca para o próximo padrão iso c ++, c ++ 0x. Atualmente, esse suporte é experimental e deve ser ativado com as opções do compilador -std = c ++ 0x ou -std = gnu ++ 0x.

2) Usando -std = c ++ 0x, meu programa compila muito bem, mas eu não modifiquei :: snprintf ou :: time, etc .. Cada função c stdlib ainda está no espaço de nome global = (! (Não, eu não sou usando namespace std nem mesmo uma vez)

Alguma ideia?

Por exemplo .. como impedir o c stdlib de invadir meu espaço de nome global? <c (lib)> é um recurso experimental do próximo padrão C ++ ou pode ser usado com segurança agora?

Então, tenho outra dúvida de que talvez mereça uma nova pergunta. Não há cmalloc. Conheço toda a história sobre o novo substituto do Malloc e por quê. mas para buffers simples de bytes simples, não há equivalente a C ++ de realloc. Sei que os blocos de memória e a realocação são implementação/tão específicos, mas quando há blocos livres contíguos do RealLoc de memória funciona melhor do que uma nova alocação de buffer e cópia de memória.

Obrigado =)!

Foi útil?

Solução

Para sua primeira pergunta, depende de quais cabeçalhos você está tentando incluir. A maioria dos cabeçalhos C está disponível no c(lib) forma na versão existente do C ++. Alguns não são e podem ser adicionados em C ++ 0x. Portanto, se você tentou incluir alguma dessas, poderá ter recebido esse erro.

Segundo, todos os cabeçalhos deste formulário garantia que as funções serão disponibilizadas no std espaço para nome. Mas eles não prometem deixar o espaço para nome global em paz. Muitas vezes, eles colocam os símbolos nos dois namespaces.

Não sei por que ::snprintf incomoda você mais do que std::snprintf no entanto. Você precisa especificar um prefixo nos dois casos.

Quanto a realloc, um equivalente em C ++ não existe, provavelmente porque é mais problemas do que vale a pena, especialmente com a semântica mais complicada do C ++ para copiar objetos. (Em particular, se você tentar usá-lo, não armaze realloc vai apenas memcpy eles para um buffer recém-alocado, se necessário, que quebrará objetos que não sejam do POD.)

Claro, você ainda pode usar o velho realloc de C incluindo seu cabeçalho. Mas eu diria que você provavelmente é melhor usar novo/excluir e simplesmente descobrir uma estratégia de alocação de buffer sensata.

Outras dicas

o malloc() função, no padrão c não é declarado no "<malloc.h>"Cabeçalho. É declarado em <stdlib.h>. O mesmo para realloc() e free().

Eu não sei sobre C ++, mas em vez de

#include <cmalloc>

tentar

#include <cstdlib>

cu003Clib> , que cercam aproximadamenteu003Clib> .h em a namespace std { }, é um recurso padrão do C ++. Consulte §17.4.1.2 Se você tiver acesso ao padrão.

Este não é um recurso experimental - qual arquivo de cabeçalho está oferecendo os problemas de compatibilidade?

Usando Malloc et al. é bom, mas não tenha certeza de nunca misturá -los com novo/excluir. (por exemplo, não delete uma malloc()'ed buffer.)

Existem alguns dos padrão Cu003Clib.h> cabeçalhos que ainda não foram transferidos parau003Cclib> . Provavelmente você usouu003Ccstdint> ou similar a algum lugar.

Com o padrão atual, você tem as bibliotecas C listadas aqui. Observe queu003Ccstdint> é não parte disso.

Não encontrei uma referência descrevendo se e quandou003Ccstdint> Fará parte do C ++, mas se eu tentar incluí -lo, também recebo uma mensagem de erro dizendo que devo usar -std = c ++ 0x, por isso presumo que esteja planejado para ser incluído no próximo padrão C ++.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top