Can the C preprocessor be used to tell if a file exists?

后端 未结 9 1688
眼角桃花
眼角桃花 2020-11-30 22:21

I have a very large codebase (read: thousands of modules) that has code shared across numerous projects that all run on different operating systems with different C++ compil

相关标签:
9条回答
  • 2020-11-30 23:01

    So far as I know cpp does not have a directive regarding the existence of a file.

    You might be able to accomplish this with a bit of help from the Makefile, if you're using the same make across platforms. You can detect the presence of a file in the Makefile:

    foo.o: foo.c
        if [ -f header1.h ]; then CFLAGS+=-DHEADER1_INC
    

    As @Greg Hewgill mentions, you can then make your #includes be conditional:

    #ifdef HEADER1_INC
    #include <header1.h>
    #endif
    
    0 讨论(0)
  • 2020-11-30 23:04

    I had to do something similar for the Symbian OS. This is how i did it: lets say you want to check if the file "file_strange.h" exists and you want to include some headers or link to some libraries depending on the existance of that file.

    first creat a small batch file for checking the existence of that file.

    autoconf is good but an over kill for many small projects.

    ----------check.bat

    @echo off
    
    IF EXIST [\epoc32\include\domain\middleware\file_strange] GOTO NEW_API
    GOTO OLD_API
    GOTO :EOF
    
    :NEW_API
    echo.#define NEW_API_SUPPORTED>../inc/file_strange_supported.h
    GOTO :EOF
    
    :OLD_API
    echo.#define OLD_API_SUPPORTED>../inc/file_strange_supported.h
    GOTO :EOF
    

    ----------check.bat ends

    then i created a gnumake file

    ----------checkmedialist.mk

    do_nothing :
        @rem do_nothing
    
    MAKMAKE : 
            check.bat
    
    BLD : do_nothing
    
    CLEAN : do_nothing
    
    LIB : do_nothing
    
    CLEANLIB : do_nothing
    
    RESOURCE : do_nothing
    
    FREEZE : do_nothing
    
    SAVESPACE : do_nothing
    
    RELEASABLES : do_nothing
    
    FINAL : do_nothing
    

    ----------check.mk ends

    include the check.mk file in your bld.inf file, it MUST be before your MMP files

    PRJ_MMPFILES
    gnumakefile checkmedialist.mk
    

    now at compile time the file file_strange_supported.h will have an appropriate flag set. you can use this flag in your cpp files or even in the mmp file for example in mmp

    #include "../inc/file_strange_supported.h"
    #ifdef NEW_API_SUPPORTED
    LIBRARY newapi.lib
    #else
    LIBRARY oldapi.lib
    #endif
    

    and in .cpp

    #include "../inc/file_strange_supported.h"
    #ifdef NEW_API_SUPPORTED
    CStrangeApi* api = Api::NewLC();
    #else
    // ..
    #endif
    
    0 讨论(0)
  • 2020-11-30 23:05

    Little Update

    Some compilers might support __has_include ( header-name ).

    The extension was added to the C++17 standard (P0061R1).

    Compiler Support

    • Clang
    • GCC from 5.X
    • Visual Studio from VS2015 Update 2 (?)

    Example (from clang website):

    // Note the two possible file name string formats.
    #if __has_include("myinclude.h") && __has_include(<stdint.h>)
    # include "myinclude.h"
    #endif
    

    Sources

    • SD-6: SG10 Feature Test Recommendations
    • Clang Language Extensions
    0 讨论(0)
提交回复
热议问题