ti-enxame.com

Diferença entre string.h e cstring?

Qual é a diferença entre string.h e cstring?

Qual deve ser usado para C e qual para C++ (se for o caso)?

18
Beginner

Em C++, você deve incluir cstring como cabeçalho, enquanto em c deve incluir string.h Como cabeçalho.

em C++

#include <cstring>

Em C

#include <string.h>

Os recursos da biblioteca padrão C também são fornecidos na biblioteca padrão C++ e, como uma convenção de nomenclatura geral, são pré-pendentes por um c aos nomes correspondentes na biblioteca padrão C.

Por exemplo:
string.h Torna-se cstring
stdio.h Torna-se cstdio e assim por diante ...


Visto que outras respostas adicionaram diferentes dimensões a esta discussão, me senti compelido a referir o padrão sagrado para limpar esta parte.

De acordo com C++ 11 20.9.14.6 & 7:

A Tabela 55 descreve o cabeçalho <cstring>.
O conteúdo é o mesmo do cabeçalho da biblioteca C Padrão, com a alteração para memchr() especificada em 21.7.

Enquanto 21.7 utilitários de sequência terminada em nulo estados:

A assinatura da função memchr(const void*, int, size_t) deve ser substituída pelas duas declarações:

const void* memchr(const void* s, int c, size_t n);
void* memchr( void* s, int c, size_t n);

ambas devem ter o mesmo comportamento da declaração original.

Anexo D (normativo) Recursos de compatibilidade [depr] estados:

cabeçalhos de biblioteca padrão D.6 C

1 Para compatibilidade com a biblioteca padrão C e C Unicode TR, a biblioteca padrão C++ fornece os 25 cabeçalhos C, conforme mostrado na Tabela 151.

Que incluem:

<assert.h> <float.h> <math.h> <stddef.h> <tgmath.h><complex.h> <inttypes.h> <setjmp.h> <stdio.h> <time.h><ctype.h> <iso646.h> <signal.h> <stdint.h> <uchar.h><errno.h> <limits.h> <stdarg.h> <stdlib.h> <wchar.h><fenv.h> <locale.h> <stdbool.h> <string.h> <wctype.h>

Mais para frente,

2 Cada cabeçalho C, cada um dos quais tem um nome no formato name.h, Se comporta como se cada nome colocado no namespace da biblioteca padrão pelo cname header Correspondente fosse colocado no global escopo do namespace. Não é especificado se esses nomes são declarados primeiro ou definidos no escopo do namespace (3.3.6) do namespace std e, em seguida, são injetados no escopo do namespace global por declarações de uso explícitas (7.3.3).

3 [Exemplo: O cabeçalho <cstdlib> Certamente fornece suas declarações e definições dentro do namespace std. Ele também pode fornecer esses nomes no namespace global. O cabeçalho <stdlib.h> Certamente fornece as mesmas declarações e definições dentro do namespace global, assim como no padrão C. Ele também pode fornecer esses nomes no namespace std. —Enviar exemplo]

Conclusão:

Das referências acima:
Estou corrigido em minha sugestão anterior, parece não haver nenhuma vantagem aparente em usar cstring em vez de string.h, Embora como @Alf sugeriu, pode haver alguns problemas de compilação devido ao uso nomes de função não qualificados ao usar cstring como cabeçalho. Portanto, considerando que não há nenhuma desvantagem aparente em usar string.h Ou vantagem em usar cstring, acho que qualquer um pode ser usado em C++ se usado de maneira adequada.

21
Alok Save

Você pode usar string.h para C e C++.

Na especificação C++ 98, ele define cstring (na especificação principal) e string.h (no Anexo D.5, cabeçalhos de biblioteca C padrão, para compatibilidade), que definem algumas funções de string da mesma forma que string.h em C. E no mundo real, todo compilador C++ fornecerá string.h para compatibilidade com o código C.

Então, na minha opinião, como o código C++ talvez seja mantido pelo codificador C, e o hábito do C, eu prefiro string.h. É bastante claro, amplamente conhecido e mais compatibilidade (com C).

BTW, listo todos os 18 cabeçalhos em C++ para compatibilidade com C, em C++ 98 spec: assert.h, iso646.h, setjmp.h, stdio.h, wchar.h, ctype.h, limits.h, signal. h, stdlib.h, wctype.h, errno.h, locale.h, stdarg.h, string.h, float.h, math.h, stddef.h, time.h

4
Googol

Há uma diferença sutil entre string.h e cstring

Resposta de Alf P. Steinbach (pode ser encontrada como um comentário à pergunta feita):

string.h coloca os identificadores no namespace global e também pode colocá-los no namespace padrão. Enquanto cstring coloca os identificadores no namespace padrão e também pode colocá-los no namespace global. Você definitivamente não quer esse comportamento cstring, porque codificar que, por exemplo, usa apenas strlen pode funcionar bem com um compilador, mas não consegue compilar com outro compilador. É uma surpresa muito desagradável. Portanto, para C e C++ , use o string.h.

4
Beginner

Em C++, os cabeçalhos da linguagem C são definidos no namespace std. Portanto, se você estiver usando esses cabeçalhos em C++, use cstring e elimine .h.

4
Jagannath

A versão C++ do cabeçalho, na verdade, tem algumas diferenças da versão C. Em C, alguns tipos são implementados como typedefs, mas em C++ isso evita que coisas como a especialização de modelo funcionem nesses tipos *, então C++ transforma alguns typedefs C em tipos reais. Isso significa que a versão C++ dos cabeçalhos C que contêm esses typedefs deve omiti-los.

C++ também permite sobrecarregar e, portanto, a versão C++ de <cstring> especifica algumas sobrecargas para funções C para permitir que uma função retorne um ponteiro para dados não constantes se o argumento de entrada for um ponteiro para dados não constantes, enquanto a função C recebe e retorna apenas ponteiros para const.

Também acho, mas não consigo encontrar a parte do padrão para verificar isso agora, que as versões C++ dos cabeçalhos devem colocar seus nomes no namespace std e apenas colocá-los no namespace global como uma extensão opcional.

* Por exemplo, o seguinte código:

typedef int Foo;
template<typename T> struct Bar {};
template<> struct Bar<int> {};
template<> struct Bar<Foo> {};

resulta no seguinte erro:

main.cpp:7:19: error: redefinition of 'Bar<int>'
template<> struct Bar<Foo> {};
                  ^~~~~~~~
main.cpp:5:19: note: previous definition is here
template<> struct Bar<int> {};
                  ^
1 error generated.

Em C, wchar_t é um typedef, portanto, isso evitaria que alguém tivesse uma especialização que se aplica a wchar_t, mas não a qualquer tipo subjacente usado para wchar_t. O fato de o MSVC 2010 implementar char32_t e char16_t como typedefs impede que eles sejam capazes de oferecer as especializações std :: codecvt para esses tipos.

2
bames53

Aparentemente cstring é para C++ e string.h é para C.

Uma coisa que vale a pena mencionar é, se você estiver mudando de string.h a cstring, lembre-se de adicionar std:: antes de todas as suas chamadas de função de string.

1
Deqing

Ao usar <cstring>, Algumas respostas sugerem o uso do namespace std::. No entanto, o código ainda será compilado e executado sem o namespace std. Isso ocorre porque: <cstring> = "string.h" + <functions defined in the std namespace>

Isso foi feito para manter a compatibilidade com C. Experimente você mesmo incluindo <cstring> E chamando memcpy() e std::memcpy().

0
CyclicUniverse