Pregunta

Este artículo de MSDN establece que getcwd () ha quedado en desuso y que se debería usar _getcwd compatible con ISO C ++ en su lugar, lo que plantea la pregunta: ¿qué hace que getcwd () no cumpla con ISO?

¿Fue útil?

Solución

Se supone que las funciones no especificadas en el estándar tienen el prefijo de un guión bajo como una indicación de que son extensiones específicas del proveedor o se adhieren a un estándar que no es ISO. Por lo tanto, el "cumplimiento" aquí fue para que Microsoft agregue un guión bajo al nombre de esta función específica ya que no es parte del estándar ISO.

Otros consejos

Hay una buena discusión sobre eso. P.J. Plauger responde a esto

  

Soy el tipo que insistió en 1983 en que el espacio de   los nombres disponibles para un programa en C se dividirán en:

     

a) aquellos definidos por la implementación en beneficio del programador (como printf)
    b) aquellos reservados al programador (como foo)
    c) aquellos reservados a la implementación (como _unlink)

     

Sabíamos incluso entonces que "la implementación" era demasiado monolítico   a menudo, más de una fuente proporciona partes de la implementación:   pero eso fue lo mejor que pudimos hacer en ese momento. Estándar C ++   ha introducido espacios de nombres para ayudar, pero solo han logrado   una fracción de sus objetivos declarados. (Eso es lo que pasa cuando   estandarizar un tigre de papel).

     

En este caso particular, Posix proporciona una lista de nombres de categoría (a)   (como desvincular) que debe definirse cuando y solo cuando   incluir ciertos encabezados. Dado que el estándar C robó sus encabezados de   Unix, que es la misma fuente que para Posix, algunos de esos encabezados   superponerse históricamente. Sin embargo, las advertencias del compilador deberían tener   alguna forma de tener en cuenta si el entorno compatible   es "puro" C ++ estándar (un ideal platónico) o un C / C ++ / Posix mixto   ambiente. El intento actual de Microsoft de ayudarnos pobres   los programadores no toman eso en cuenta. Insiste en tratar   desvincular como un nombre de categoría (b), que es miope.

Bueno, GCC no declarará nombres POSIX en modo C estricto, al menos (aunque, todavía lo hace en modo C ++):

#include <stdio.h>

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

Salida usando -std=c99

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

Tendrá que decirle explícitamente que está operando en una C / Posix mixta utilizando macros de prueba de características o sin pasar ningún estándar específico. Luego se establecerá de forma predeterminada en gnu89 , que asume un entorno mixto ( man feature_test_macros ). Aparentemente, MSVC no tiene esa posibilidad.

Como otros ya han señalado, getcwd no está incluido en ISO C ++, pero es parte de POSIX / IEEE Std 1003.1.

Microsoft ha decidido incluir algunas de las funciones POSIX más utilizadas en su biblioteca estándar C (pero prefija estas funciones con un guión bajo para desalentar esencialmente su uso).

Para agregar a la publicación de Dan Olson: Consulte Cumplimiento de ANSI C página en MSDN

  

Los nombres de las funciones específicas de Microsoft y las variables globales comienzan con un solo guión bajo. Estos nombres se pueden reemplazar solo localmente, dentro del alcance de su código. Por ejemplo, cuando incluye archivos de encabezado de tiempo de ejecución de Microsoft, aún puede anular localmente la función específica de Microsoft llamada _open al declarar una variable local del mismo nombre. Sin embargo, no puede usar este nombre para su propia función global o variable global.

Hasta donde yo sé, getcwd () nunca ha sido parte del estándar ISO C ++. _getcwd () definitivamente no lo es, ya que los nombres estándar no comenzarán con un guión bajo.

De hecho, el artículo de MSDN enlaza con una página de manual que dice que está declarada en direct.h , que no es un archivo de encabezado C ++ estándar. El artículo me parece falso.

Para el registro, getcwd () no fue desaprobado por ISO. Estaba "en desuso" por Microsoft. Microsoft reescribió muchas funciones C, a menudo teniendo en cuenta un poco mejor la seguridad (por ejemplo, funciones de cadena que también toman un parámetro max_length ). Luego hicieron que su compilador emitiera estas advertencias, lo que considero falso porque ningún grupo de estándares desaprobó ninguna de las funciones declaradas en desuso.

El artículo de MSDN es algo confuso en lo que una persona normal concluiría con solo una lectura rápida (si no lo leen con un ojo de abogado muy cuidadoso).

Lo que dice el artículo de MSDN es: getcwd () no cumple con el estándar ISO C ++. Para cumplir con ese estándar ISO C ++ para nombrar funciones (que es lo que viola getcwd), Microsoft colocó correctamente un _ en el frente de la función, por lo que la misma función se convierte en _getcwd (). Esa es la forma compatible con ISO C ++ de nombrar la función porque getcwd () y _getcwd () no son una función estándar de ISO C ++, sino una función específica de Microsoft (proveedor) o específica de implementación.

El artículo no indica qué sería una llamada estándar C ++ ISO para obtener el directorio de trabajo ... aunque eso es lo que la gente tiende a leer de un vistazo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top