Pergunta

Este artigo MSDN estados que getcwd () está obsoleto e que _getcwd o ISO C ++ compatível deve ser usado em vez disso, o que levanta a questão: o que faz getcwd () não ISO-compliant

Foi útil?

Solução

As funções não especificados na norma devem ser precedido por um sublinhado como uma indicação de que eles são extensões específicas do fornecedor ou aderir a um padrão não-ISO. Assim, o "cumprimento" aqui era para Microsoft para adicionar um sublinhado para o nome desta função específica, uma vez que não é parte do padrão ISO.

Outras dicas

Há um discussão boa sobre isso. P.J. respostas Plauger a esta

Eu sou o cara que insistiu em 1983 que o espaço de nomes disponíveis para um programa C ser dividida em:

a) os definidos pela implementação para o benefício do programador (como printf)
b) aqueles reservados para o programador (como foo)
c) os reservados para a implementação (como _unlink)

Nós sabia mesmo então que "a implementação" era muito monolítica - muitas vezes mais do que uma fonte de suprimentos bits da implementação - mas isso era o melhor que poderíamos fazer no momento. Padrão C ++ introduziu namespaces para ajudar, mas eles só têm conseguido uma fração de seus objetivos declarados. (Isso é o que acontece quando você padronizar um tigre de papel.)

Neste caso particular, POSIX fornece uma lista de nomes de categorias (a) (Tais como unlink) que você deve ficar definido quando e somente quando você incluem certas cabeçalhos. Desde o C Padrão roubou seus cabeçalhos de Unix, que é da mesma fonte que para Posix, alguns desses cabeçalhos sobrepõem historicamente. No entanto, os avisos do compilador deve ter alguma forma de levar em conta se o ambiente suportado é "pura" C ++ padrão (um ideal platónico) ou uma mistura de C / C ++ / Posix meio Ambiente. A tentativa atual pela Microsoft para nos ajudar pobres programadores não leva isso em conta. Ele insiste em tratar Unlink como A (b) Razão categoria, que é míope.

Bem, GCC não irá declarar nomes POSIX no modo C estrita, pelo menos (embora, ele ainda faz no modo C ++):

#include <stdio.h>

int main() {
    &fdopen;
    return 0;
}

Saída usando -std=c99

test.c: In function 'main':
test.c:4: error: 'fdopen' undeclared (first use in this function)

Você terá que dizer explicitamente que você está operando em um misto C / POSIX usando macros de teste recurso ou não passar qualquer padrão específico. Será então o padrão para gnu89 que assume um ambiente misto (man feature_test_macros). Aparentemente, MSVC não tem essa possibilidade.

Como outros já apontaram, getcwd não está incluído no ISO C ++, mas é parte de POSIX / IEEE Std 1003.1.

Microsoft decidiu incluir algumas das funções mais utilizadas POSIX em sua biblioteca padrão C (mas prefixo estas funções com um sublinhado, essencialmente, desencorajar o seu uso).

Para adicionar ao post de Dan Olson: Veja ANSI C Compliance página no MSDN

Os nomes de funções específicas da Microsoft e variáveis ??globais começam com um único sublinhado. Estes nomes podem ser substituídos apenas localmente, no âmbito do seu código. Por exemplo, quando você incluir arquivos de cabeçalho do tempo de execução da Microsoft, você pode ainda localmente substituir a função específica de Microsoft chamado _open declarando uma variável local com o mesmo nome. No entanto, você não pode usar esse nome para sua própria função global ou variável global.

Tanto quanto eu sou getcwd conscientes () nunca fez parte da Norma ISO C ++. _getcwd () definitivamente não é, como nomes padrão não vai começar com um sublinhado.

Na verdade, o artigo ligações MSDN para uma página de homem que diz que ele é declarado em direct.h , que não é um padrão C ++ arquivo de cabeçalho. O artigo parece falso para mim.

Para o registro, getcwd() não foi preterido pela ISO. Foi "obsoleta" pela Microsoft. Microsoft reescreveu muitas funções C - muitas vezes com um pouco melhor a segurança em mente (por exemplo, funções de cadeia, que também tem um parâmetro max_length). Eles então tiveram sua saliva compilador a esses avisos, que eu considero falsa, porque nenhum grupo normas obsoleta qualquer uma das funções declarado obsoleto.

O artigo do MSDN é um pouco confuso em que uma pessoa normal poderia concluir a partir de apenas uma leitura rápida (se não lê-lo com um olho advogado muito cuidado).

O que o artigo MSDN diz é: getcwd () não é compatível com o padrão ISO C ++. Para cumprir com esse padrão ISO C ++ para a nomeação de funções (que é o que getcwd viola), Microsoft colocar corretamente um _ na frente da função, então a mesma função se torna _getcwd (). Essa é a maneira compatível com a ISO C ++ de nomear a função porque getcwd () e _getcwd () não são uma função ISO C ++ padrão, mas são um Microsoft específico (fornecedor), ou função implementação específica.

O artigo não indica que uma chamada padrão C ++ ISO para obter o diretório de trabalho seria ... embora isso é o que as pessoas tendem a ler em uma rápida olhada.

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