c – 依赖#defines的最佳实践?

前端之家收集整理的这篇文章主要介绍了c – 依赖#defines的最佳实践?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
是否有支持C/C++预处理程序标志依赖项的最佳实践,如-DCOMPILE_WITHOUT_FOO?这是我的问题:
> setenv COMPILE_WITHOUT_FOO
> make <Make system reads environment,sets -DCOMPILE_WITHOUT_FOO>
  <Compiles nothing,since no source file has changed>

我想要做的是让依赖#ifdef语句的所有文件都被重新编译:

> setenv COMPILE_WITHOUT_FOO
> make
  g++ FileWithIfdefFoo.cpp

如果COMPILE_WITHOUT_FOO的值没有改变,我不想要重新编译所有内容.

我有一个原始的Python脚本工作(见下文),它基本上写了一个头文件FooDefines.h然后对它进行区分以查看是否有任何不同.如果是,它将替换FooDefines.h,然后传统的源文件依赖接管.不使用-D在命令行上传递define.缺点是我现在必须在任何使用#ifdef的源文件中包含FooDefines.h,并且每个#ifdef都有一个新的,动态生成的头文件.如果有一个工具可以做到这一点,或者是一种避免使用预处理器的方法,我会全力以赴.

import os,sys
def makeDefineFile(filename,text):
    tmpDefineFile = "/tmp/%s%s"%(os.getenv("USER"),filename) #Use os.tempnam?
    existingDefineFile = filename

    output = open(tmpDefineFile,'w')
    output.write(text)
    output.close()

    status = os.system("diff -q %s %s"%(tmpDefineFile,existingDefineFile))

    def checkStatus(status):
        Failed = False
        if os.WIFEXITED(status):
            #Check return code
            returnCode = os.WEXITSTATUS(status)
            Failed = returnCode != 0
        else:
            #Caught a signal,coredump,etc.
            Failed = True
        return Failed,status

    #If we Failed for any reason (file didn't exist,different,etc.)
    if checkStatus(status)[0]:
        #Copy our tmp into the new file
        status = os.system("cp %s %s"%(tmpDefineFile,existingDefineFile))
        Failed,status  = checkStatus(status)
        print Failed,status
        if Failed:
            print "ERROR: Could not update define in makeDefine.py"
            sys.exit(status)

解决方法

这肯定不是最好的方法,但它可以工作:
find . -name '*cpp' -o -name '*h' -exec grep -l COMPILE_WITHOUT_FOO {} \; | xargs touch

这将查看宏COMPILE_WITHOUT_FOO的源代码,并“触摸”每个文件,这将更新时间戳.然后,当您运行make时,这些文件将重新编译.

如果安装了ack,则可以简化此命令:

ack -l --cpp COMPILE_WITHOUT_FOO | xargs touch

猜你在找的C&C++相关文章