Fråga: kan man kolla om en fil finns? (preprocessor)
Fråga: kan man kolla om en fil finns? (preprocessor)
Ja, tanken dök upp pga. ett projekt.
Jag skulle ibland vilja ha möjligheten att kunde inkludera en specifik fil (#include "xxx.y") - men bara om den finns.
Så jag undrar om man i C preprocessorn kan kolla om en given fil existerar. Alltså något liknande:
#if exists("xxxx.y")
#include "xxxx.y"
#else
.... ställ en del defaults eller liknande
#endif
Jag, jag har letat efter det men aldrig hittat det.
Jag skulle ibland vilja ha möjligheten att kunde inkludera en specifik fil (#include "xxx.y") - men bara om den finns.
Så jag undrar om man i C preprocessorn kan kolla om en given fil existerar. Alltså något liknande:
#if exists("xxxx.y")
#include "xxxx.y"
#else
.... ställ en del defaults eller liknande
#endif
Jag, jag har letat efter det men aldrig hittat det.
Re: Fråga: kan man kolla om en fil finns? (preprocessor)
Gör man inte sådant i make-filen?
https://www.google.se/#q=makefile+test+file+exists
https://www.google.se/#q=makefile+test+file+exists
-
- Inlägg: 1394
- Blev medlem: 29 januari 2011, 21:06:30
- Ort: Lapplandet
Re: Fråga: kan man kolla om en fil finns? (preprocessor)
Nej det går inte direkt i preprocessorn. Möjligtvis att finns någon obskyr kompilator med stöd för det, men det går inte i de tre stora (MSVC, GCC, clang).
Men jag kan tänka mig några alternativ som skulle fungera, beroende på hur flexibla ni är på att göra ändringar i byggsystemet.
1) (endast GCC äldre än 4.5)
Låt xxxx.y sätta en #define att den finns. Sen i filen som ska inkludera den
Anledningen att detta bara fungerar i gamla gcc-versioner är att från och med 4.5 började man hantera saknade include-filer som fatal errors. Innan så var det bara en varning.
2) Nästan samma som 1, men skapa en tom fil med samma namn i en sökväg med lägre prioritet.
3) Låt makefilen testa om filen finns och sätta en define via kommandoraden.
4) autoconf
Men jag kan tänka mig några alternativ som skulle fungera, beroende på hur flexibla ni är på att göra ändringar i byggsystemet.
1) (endast GCC äldre än 4.5)
Låt xxxx.y sätta en #define att den finns. Sen i filen som ska inkludera den
Kod: Markera allt
#include "xxxx.y"
#ifndef HAS_CONFIG_FILE
// sätt defaults
#endif
2) Nästan samma som 1, men skapa en tom fil med samma namn i en sökväg med lägre prioritet.
3) Låt makefilen testa om filen finns och sätta en define via kommandoraden.
4) autoconf
Re: Fråga: kan man kolla om en fil finns? (preprocessor)
Hmmm - testade att göra en #define NO_CONFIG_READ i huvudfilen - men det "såg" inte den include-fil som i sin tur vill ha en specifik fil som jag rent faktisk har men sökvägen (som denna config-fil finns i) blir inte förmedlat till den inckluderade filen.
Nåja, kompilern är MPLAB X, nyaste.
Skit samma, jag får hitta en annan lösning.
Nåja, kompilern är MPLAB X, nyaste.
Skit samma, jag får hitta en annan lösning.
Re: Fråga: kan man kolla om en fil finns? (preprocessor)
googlar man så dyker det upp en del faktiskt, men det beror ju helt och hållet på miljön du sitter i
Re: Fråga: kan man kolla om en fil finns? (preprocessor)
Hmm, vilken prolle, Om det är PIC32, så är det GCC och GCC kan göra det.
Finns ett PP-direktiv i GCC som heter "__has_include ( header-name )" Gör exakt samma som #include, nästan, dock inkluderas inte filen utan testas om filen finns, med svaret 0 eller 1, du använder det i ett #if-block,
Typ:
Finns ett PP-direktiv i GCC som heter "__has_include ( header-name )" Gör exakt samma som #include, nästan, dock inkluderas inte filen utan testas om filen finns, med svaret 0 eller 1, du använder det i ett #if-block,
Typ:
Kod: Markera allt
#ifdef __has_include
# if __has_include(<optional>)
# include <optional>
# define have_optional 1
# elif __has_include(<experimental/optional>)
# include <experimental/optional>
# define have_optional 1
# define experimental_optional
# else
# define have_optional 0
# endif
#endif
-
- Inlägg: 1394
- Blev medlem: 29 januari 2011, 21:06:30
- Ort: Lapplandet
Re: Fråga: kan man kolla om en fil finns? (preprocessor)
Fungerar det i C också? __has_include är c++17
Re: Fråga: kan man kolla om en fil finns? (preprocessor)
Inte en aning, det är bara att testa gissar jag, men GCC är ju en C++ kompilator, och i MPLABX går den att köra i C++-läge.
Re: Fråga: kan man kolla om en fil finns? (preprocessor)
TomasL: Tack! Om min kompiler stödjer det ville det just vara grejen.
Men det är i detta fall XC8 så den är inte helt med i det nyaste.
Det betyder dock inte att jag inte kan använda det i andra projekt och det är jag tacksam för.
Men det är i detta fall XC8 så den är inte helt med i det nyaste.
Det betyder dock inte att jag inte kan använda det i andra projekt och det är jag tacksam för.
Re: Fråga: kan man kolla om en fil finns? (preprocessor)
Kanske inte den snyggaste lösningen men jag testade att göra så här:
Skapa "filfinns.bat" i projektkatalogen (ProjectDir i MplabX).
Lägg till några rader i din headerfil där jobbet skall göras, jag lade detta i main.h i ett befintligt projekt bara:
Ändra i Project properties -> Building -> Execute this line before build, bocka i rutan samt skriv "filfinns.bat" på raden.
Verkar fungera för mig då jag får olika meddelanden i Output-fönstret i MplabX beroende av om "testfil.txt" finns i min Documents-katalog eller inte.
Tog idén härifrån: http://www.microchip.com/forums/m809239.aspx
Skapa "filfinns.bat" i projektkatalogen (ProjectDir i MplabX).
Kod: Markera allt
@ECHO OFF
if exist %USERPROFILE%\Documents\testfil.txt (
echo #define filfinns > filfinns.h
) else (
echo /* Fil saknas */ > filfinns.h
)
Kod: Markera allt
/* Filtest */
#include "filfinns.h"
#ifdef filfinns
#advisory Filen finns!
#else
#advisory Filen saknas!
#endif
Verkar fungera för mig då jag får olika meddelanden i Output-fönstret i MplabX beroende av om "testfil.txt" finns i min Documents-katalog eller inte.
Tog idén härifrån: http://www.microchip.com/forums/m809239.aspx