This MSDN article indica que getcwd() ha quedado obsoleto y que se debe usar el _getcwd compatible con ISO C++, lo que plantea la pregunta: ¿qué hace que getcwd() no sea compatible con ISO?¿Por qué getcwd() no cumple con ISO C++?
Respuesta
Las funciones no especificadas en el estándar deben ir precedidas de un guion bajo como indicación de que son extensiones específicas del fabricante o que se adhieren a un estándar que no es ISO. Por lo tanto, el "cumplimiento" fue que Microsoft añadiera un guión bajo al nombre de esta función específica, ya que no forma parte del estándar ISO.
Por lo que sé, getcwd() nunca ha formado parte de la norma 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 vincula a una página man que dice que está declarada en direct.h, que no es un archivo de encabezado Standard C++. El artículo me parece falso.
Para añadir al mensaje de Dan Olson: Ver ANSI C Compliance página en MSDN
Los nombres de funciones y variables globales específicas de Microsoft comienzan con un solo subrayado. Estos nombres pueden ser reemplazados 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 denominada _open declarando una variable local del mismo nombre. Sin embargo, no puede usar este nombre para su propia función global o variable global.
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).
Hay un good discussion sobre eso. P.J. Plauger respuestas a esta
Soy el tipo que insiste en 1983 que el espacio de nombres disponibles para un programa en C puede dividir en:
a) las definidas por la aplicación de la beneficio del programador (como printf)
b) las reservadas para el programador (como foo)
c) las reservadas a la aplicación (tal como _unlink)Nos sabía ya entonces que "la ejecución" era demasiado monolítica - menudo más de una fuente de materiales de bits de la aplicación - pero eso era lo mejor que podíamos hacer en ese momento. El 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 sucede cuando se estandarizar un tigre de papel.)
En este caso particular, Posix suministra una lista de la categoría (a) Nombres (como unlink) que debe obtener define cuando y sólo cuando incluyes ciertos encabezados.Dado que C Standard robó sus encabezados de Unix, que es la misma fuente que para Posix, algunos de esos encabezados se superponen históricamente. Sin embargo, las advertencias del compilador deben tener alguna forma de tener en cuenta si el entorno compatible es "puro" Estándar C++ (un ideal platónico) o un entorno mixto C/C++/Posix . El intento actual de Microsoft de ayudarnos a los programadores pobres no lo tiene en cuenta. Insiste en tratar el desvinculación como un nombre de categoría (b), que es miope.
Bueno, GCC no declarará nombres POSIX en el modo C estricta, por lo menos (sin embargo, todavía lo hace en el 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)
Usted tendrá que decirle explícitamente que está operando en un C/Posix mixto al usar macros de prueba de características o que no pasa ningún estándar específico. Se establecerá de manera predeterminada en gnu89
, lo que supone un entorno mixto (man feature_test_macros
). Aparentemente, MSVC no tiene esa posibilidad.
GCC no declara nombres POSIX o incluso C estándar. Ese es el trabajo de glibc. – Potatoswatter
Para el registro, ISO no desaprobó getcwd()
. Fue "obsoleto" por Microsoft. Microsoft reescribió muchas funciones C, a menudo con un poco más de seguridad en mente (por ejemplo, funciones de cadena que también toman un parámetro max_length
). Luego hicieron que su compilador escupiera estas advertencias, lo que considero falso porque ningún grupo de estándares desaprobó ninguna de las funciones declaradas en desuso.
_CRT_SECURE_NO_WARNINGS and forget :) –
Pregunta: "¿por qué getcwd() no cumple con la ISO?/Este artículo de MSDN indica que getcwd() ha quedado obsoleto ..." Respuesta: "getcwd() no está en desuso; Microsoft está escupiendo advertencias con una extraña definición de 'obsoleto' ". ¿Cómo no responde eso la pregunta? ¿De qué manera estaba pidiendo una aclaración? –
'getcwd()' también está obsoleto por GNU.Consulte la página de manual "Por razones de portabilidad y seguridad, el uso de getwd() está en desuso". –
El artículo de MSDN es algo confuso en lo que una persona normal concluiría de una lectura rápida (si no lo leen con un ojo muy cuidadoso de un abogado).
Lo que el artículo de MSDN dice es: getcwd() no es compatible con el estándar ISO C++. Para cumplir con ese estándar ISO C++ para nombrar funciones (que es lo que getcwd viola), Microsoft pone 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++ para nombrar la función porque getcwd() y _getcwd() no son una función estándar de ISO C++, sino que son una función específica de implementación específica de Microsoft (proveedor).
El artículo no indica qué sería una llamada estándar ISO de C++ para obtener el directorio de trabajo ... aunque eso es lo que la gente tiende a leer de un vistazo rápido.
- 1. ¿Por qué mi código no cumple con CLS?
- 2. El tipo de argumento no cumple con CLS, ¿por qué?
- 3. ¿Por qué mi función no cumple con CLS? Tipo
- 4. ¿Por qué no se cumple el uso múltiple de PreApplicationStartMethodAttribute?
- 5. ¿Por qué debería escribir el código que cumple con CLS?
- 6. ¿Por qué este nombre con guión bajo no cumple con CLS?
- 7. ¿Hay un C++ equivalente a getcwd?
- 8. ¿Por qué Safari no cumple con mi directiva de control de caché?
- 9. borrador estándar de ISO C++
- 10. Prueba de conformidad ISO C estricta
- 11. ¿Por qué C++ es compatible con C? ¿Por qué no hay algún lenguaje C++ "puro"?
- 12. ¿Cómo puedo saber qué dependencia de ELF no se cumple?
- 13. advertencia GCC: ISO C no permite nombrados macros variadic
- 14. ¿Por qué las expresiones regulares no forman parte de ISO C99
- 15. Diferencia entre getcwd() y dirname (__ FILE__)? ¿Qué debería usar?
- 16. ¿Qué es #defined si un compilador cumple con Cpp0x?
- 17. ¿Qué son los idiomas ISO?
- 18. Visual Studio no cumple con los directorios de inclusión
- 19. ¿Por qué ninguna base de datos es totalmente compatible con los estándares ANSI o ISO SQL?
- 20. ¿Por qué no puedo establecer el tipo de codificación XDocument XDeclaration en iso-8859-1?
- 21. ¿Por qué mis enums C# no funcionan?
- 22. ¿Por qué C no tiene paquete privado?
- 23. ¿Por qué una compilación C no verifica?
- 24. ¿Por qué C++ no permite estructuras anónimas?
- 25. ¿Por qué no hay ReverseEnumerator en C#?
- 26. ¿Cumple WordPress MVC?
- 27. ¿Cumple Drupal con el paradigma de MVC?
- 28. ¿Por qué no se especifica type_info :: name()?
- 29. Desarrollador Java cumple Objective-C en Mac OS
- 30. ¿Por qué C# no tiene bibliotecas estáticas de estilo C++?
Tienen su trabajo recortado convertir la API de Windows :-) –
No creo que nadie haya afirmado que la API de Win32 era compatible con nada. windows.h ni siquiera compila si deshabilita las extensiones de lenguaje en VC++. :) – jalf
Lo confuso es que lo hicieron para posponer funciones que no estaban en los encabezados C estándar también. –