Fråga: kan man kolla om en fil finns? (preprocessor)

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Fråga: kan man kolla om en fil finns? (preprocessor)

Inlägg 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.
Maalobs
Inlägg: 1299
Blev medlem: 3 februari 2005, 14:35:15
Ort: Stockholm

Re: Fråga: kan man kolla om en fil finns? (preprocessor)

Inlägg av Maalobs »

Gör man inte sådant i make-filen?
https://www.google.se/#q=makefile+test+file+exists
Mr Andersson
Inlägg: 1394
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Re: Fråga: kan man kolla om en fil finns? (preprocessor)

Inlägg 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
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Fråga: kan man kolla om en fil finns? (preprocessor)

Inlägg 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.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45175
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Fråga: kan man kolla om en fil finns? (preprocessor)

Inlägg 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
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45175
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Fråga: kan man kolla om en fil finns? (preprocessor)

Inlägg 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
Mr Andersson
Inlägg: 1394
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Re: Fråga: kan man kolla om en fil finns? (preprocessor)

Inlägg av Mr Andersson »

Fungerar det i C också? __has_include är c++17
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45175
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Fråga: kan man kolla om en fil finns? (preprocessor)

Inlägg 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.
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Fråga: kan man kolla om en fil finns? (preprocessor)

Inlägg 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.
Användarvisningsbild
swesysmgr
Inlägg: 14127
Blev medlem: 28 mars 2009, 06:56:43
Ort: Göteborg

Re: Fråga: kan man kolla om en fil finns? (preprocessor)

Inlägg 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
Skriv svar