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

后端 未结 9 1740
眼角桃花
眼角桃花 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: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
    

提交回复
热议问题