MSVC compilador dice que fopen() está en desuso, y recomienda el uso de fopen_s().

Es hay alguna forma de usar fopen_s() y todavía ser portátil?

Alguna idea para un #define?

Un problema similar, aquí.

OriginalEl autor Shantia | 2009-10-03

5 Comentarios

  1. 26

    De Microsoft *_s funciones son transportables, yo normalmente uso equivalente C89/C99 funciones y desactivar la desaprobación advertencias (#define _CRT_SECURE_NO_DEPRECATE).

    Si usted insiste, puede utilizar una función de adaptador (no necesariamente una macro!) que los delegados fopen() en plataformas que no tienen fopen_s(), pero usted debe ser cuidadoso para asignar los valores de errno_t código de retorno de errno.

    errno_t fopen_s(FILE **f, const char *name, const char *mode) {
        errno_t ret = 0;
        assert(f);
        *f = fopen(name, mode);
        /* Can't be sure about 1-to-1 mapping of errno and MS' errno_t */
        if (!*f)
            ret = errno;
        return ret;
    }

    Sin embargo, no veo cómo fopen_s() es más seguro que fopen(), así que me voy para la portabilidad.

    Microsoft le ENCANTA hacer su propia versión de las cosas. Me pregunto por qué…
    Lo curioso es que ahora son parte de C11 (aunque en el Anexo opcional K)
    Mucho mejor que mi (ahora ex, no es que yo necesite más puro enfoque macro. Su enfoque de función reproduce parcialmente el fopen_s comportamiento en caso de fallo de regresar errno (= EINVAL, es decir, 22, por lo que vale). Usted podría también generar un parámetro no válido excepción para que coincida con fopen_s comportamiento aún más de cerca.
    Por CIERTO, según este, errno «se expande a una estática modificables lvalue de tipo int )hasta que a la de C++11)», y «se expande a un local de subprocesos modificables lvalue de tipo int (ya que C++11).» Por lo que su tipo de retorno debe ser de tipo int.

    OriginalEl autor Alex B

  2. 7

    En C/C++ de código,

    #ifdef __unix
    #define fopen_s(pFile,filename,mode) ((*(pFile))=fopen((filename),(mode)))==NULL
    #endif

    En El Fichero Makefile

    CFLAGS += -D'fopen_s(pFile,filename,mode)=((*(pFile))=fopen((filename),(mode)))==NULL'

    La atención que en el éxito fopen_s return 0 mientras fopen devolver un valor distinto de cero puntero de archivo. Por lo tanto, es necesario añadir «) ==NULL» al final de la macro, por ejemplo:

    if (fopen_s(&pFile,filename,"r")) perror("cannot open file");

    OriginalEl autor Jichao

  3. 2

    Muchos de seguro de Microsoft funciones que se incluyen en el Anexo K de la C11 estándar, pero no está ampliamente soportado, por lo que la portabilidad es todavía un problema. Hay una necesidad para la mejora de la seguridad en algunas aplicaciones; tal vez el apoyo va a mejorar en el futuro.

    El pasado, yo lo hice así:

      #define fopen_s(fp, fmt, mode)          *(fp)=fopen( (fmt), (mode))

    La macro es simple y directa, lo suficientemente bueno para algo rápido y sucio, pero no proporcionan el comportamiento de excepción de fopen_s, y no proporcionan la seguridad de la real fopen_s función.

    @Alex B, la función de enfoque sobre parcialmente reproduce el comportamiento adecuado en caso de error; devuelve el valor (= EINVAL). Su enfoque puede ser ampliado mediante la generación de un parámetro no válido excepción más plenamente de reproducir el comportamiento de fopen_s.

    OriginalEl autor riderBill

  4. 0

    De acuerdo a https://en.cppreference.com/w/c/io/fopen
    es posible habilitar *_s funciones en stdc biblioteca

    «Como con todos los límites marcada de funciones, fopen_s sólo está garantizada si STDC_LIB_EXT1 se define por la aplicación y si el usuario define STDC_WANT_LIB_EXT1 a la constante entera 1 antes de incluir stdio.h.»

    OriginalEl autor Bill Sun

Dejar respuesta

Please enter your comment!
Please enter your name here