sirve qué programación preprocesador para librerias lenguaje estructura estandar directivas directiva archivos c include c-preprocessor stringification

qué - ¿Puedo dividir una directiva larga#include en dos líneas?



librerias estandar de c++ (5)

Me gustaría que hubiera una forma de dividir una directiva #include en dos líneas, de modo que mi código pueda ajustarse a 80 caracteres por línea, a pesar de la necesidad de una ruta de inclusión muy larga.

Aparte de expandir la ruta de búsqueda del compilador, ¿cómo puedo gestionar esto? ¿Hay una manera de dividir mi cadena de ruta muy larga en dos líneas?

La expansión de la macro "#define" aparentemente ocurre después de la expansión #include, por lo que no funcionan:

#define BIGPATH "..." #include BIGPATH ## "/foo.c" #include "BIGPATH/foo.c" #include BIGPATH"/foo.c"

También he intentado

#include "foo" ## "bar"

y

#include "foo" / "bar"

En vano. ¿Acaso lo que quiero es imposible? Ayúdame, kenobi stackoverflow, eres mi única esperanza.

RESPUESTA : basándose en la respuesta sugerida a continuación, esto es lo que realmente funcionó para mí:

#define STRINGIFY(x) #x #define PATH(path) STRINGIFY(/my/very/long/path) #include PATH(foo.h) #undef PATH #undef STRINGIFY


Esto se compila para mí (lo estoy basando en cómo recuerdo que Boost.PP funciona):

#define a() <vec/ tor> #include a() int main() { std::vector<int> x; }

Simplemente cambie <vector> a su ruta completa. No creo que pueda concatenar cadenas de la forma que necesita en #include .


No me gusta la idea de esto, solo quería mencionar esta posibilidad. Lo mejor es ir por el camino que mencionó Daniel Fischer. Esta solución es un poco peculiar y no funcionará en todas las circunstancias, pero se compila aquí:

#define PATH(FILE) </path/to/FILE> #include PATH(file.h)

Y solo para nombrar algunas de las limitaciones obvias:

  • La ruta de búsqueda de estos incluye no es "local"
  • ARCHIVO no debe contener "," (bastante raro)
  • el PATH define puede superar los 80 caracteres

Siéntase libre de añadir a esta lista.

Editar
Solo para una mejor legibilidad, publicaré la solución del comentario de Jonathans a continuación en el estilo de mi ejemplo:

#define STRINGIFY(x) #x #define PATH(FILE) STRINGIFY(/path/to/FILE) #include PATH(foo.h)

Esta versión mitiga el "problema de localidad" de la versión #include <> , ya que se asigna a #include ""


No, no puede, el preprocesador requiere que el nombre de archivo de inclusión sea un único token de preprocesamiento. Debe corregir la ruta de búsqueda de inclusión que está utilizando o reducir el requisito de 80 caracteres por línea.


Todas las directivas de preprocesamiento se terminan con un token de nueva línea. La directiva de inclusión es de una de las siguientes formas:

# include < h-char-sequence> new-line # include " q-char-sequence" new-line # include pp-tokens new-line

Su último ejemplo dará como resultado que se ejecute #include "foo" "bar" porque, aunque la eliminación de la nueva línea escapada ocurrirá antes de la ejecución de la directiva, la concatenación de cadenas se realizará posteriormente. Esto coincide con la forma final válida de una directiva de inclusión.

Sin embargo, lo que sucede con este formulario es que se reemplazará cualquier nombre de macro que se include continuación. El tuyo no tiene macros. Si la directiva resultante no coincide con ninguna de las dos formas normales, el comportamiento no está definido.

Si la directiva resultante después de todos los reemplazos no coincide con uno de los dos formularios anteriores, el comportamiento no está definido

El estándar tiene una nota específica sobre el caso donde hay múltiples literales de cadena:

Tenga en cuenta que los literales de cadena adyacentes no se concatenan en un solo literal de cadena (consulte las fases de traducción en 2.2); por lo tanto, una expansión que da como resultado dos literales de cadena es una directiva no válida.

Por eso ese ejemplo no funciona. Sin embargo, significa que podemos confiar en la expansión de macros para generar un nombre de archivo válido. Por ejemplo:

#define LONG_PATH(file) <foo/bar/baz/file> #include LONG_PATH(file.h)

O:

#define STRINGIZE(x) #x #define LONG_PATH(file) STRINGIZE(foo/bar/baz/file) #include LONG_PATH(file.h)


Utilice otro archivo de encabezado con un nombre corto para almacenar archivos de encabezado con nombres largos. Por lo tanto, todos los encabezados que superen tu mínimo de 80 caracteres no están en tu código bien formateado.

//short_name.h #include "really_really_long_include_name.h" //code #include "short_name.h"