Sida 1 av 1
Fråga: kan man kolla om en fil finns? (preprocessor)
Postat: 19 september 2016, 10:39:28
av Icecap
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.
Re: Fråga: kan man kolla om en fil finns? (preprocessor)
Postat: 19 september 2016, 11:14:41
av Maalobs
Re: Fråga: kan man kolla om en fil finns? (preprocessor)
Postat: 19 september 2016, 11:28:57
av Mr Andersson
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
Kod: Markera allt
#include "xxxx.y"
#ifndef HAS_CONFIG_FILE
// sätt defaults
#endif
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
Re: Fråga: kan man kolla om en fil finns? (preprocessor)
Postat: 19 september 2016, 12:15:12
av Icecap
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.
Re: Fråga: kan man kolla om en fil finns? (preprocessor)
Postat: 19 september 2016, 18:21:09
av TomasL
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)
Postat: 19 september 2016, 18:35:54
av TomasL
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:
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
Re: Fråga: kan man kolla om en fil finns? (preprocessor)
Postat: 20 september 2016, 00:18:29
av Mr Andersson
Fungerar det i C också? __has_include är c++17
Re: Fråga: kan man kolla om en fil finns? (preprocessor)
Postat: 20 september 2016, 06:21:59
av TomasL
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)
Postat: 20 september 2016, 08:43:49
av Icecap
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.
Re: Fråga: kan man kolla om en fil finns? (preprocessor)
Postat: 21 september 2016, 20:59:58
av swesysmgr
Kanske inte den snyggaste lösningen men jag testade att göra så här:
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
)
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:
Kod: Markera allt
/* Filtest */
#include "filfinns.h"
#ifdef filfinns
#advisory Filen finns!
#else
#advisory Filen saknas!
#endif
Ä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