【问题标题】:Conditional compilation: compile once if macro is present at least once条件编译:如果宏至少存在一次,则编译一次
【发布时间】:2012-06-26 13:42:13
【问题描述】:

我正在编写一个 C 程序并想编写一个函数,以便如果某个宏被使用至少一次,该函数将在目标文件恰好一次

我在考虑以下几行:

#define CERTAIN_MACRO \
    ...some code here... \
    #include "myfunction.h"

(在 myfunction.h 中添加我的函数代码,并使用合适的包含保护以防止多次包含),或

#define CERTAIN_MACRO \
    ...some code here... \
    #define USE_MY_FUNCTION

#ifdef USE_MY_FUNCTION
    my function code
#endif

但两者都不起作用,因为宏扩展代码中不允许使用 #define#include。有什么建议吗?

【问题讨论】:

  • 我认为这不可能。建议:问问你真正想要解决的问题,可能还有其他方法可以实现。例如,如果真正的目标是该函数在未使用时不存在于二进制文件中,则标记函数static 可能会完成这项工作,因为如果未使用,编译器可以将其删除。但是再举一个例子,如果函数中有一个#error,当且仅当宏在文件的其他地方使用时,您要触发该函数,那么您就不走运了。
  • 不要试图让编译器做链接器的工作。把你的函数放到一个单独的文件中,编译它,然后构建一个静态库。让链接器完成剩下的工作。
  • 我想我会选择基于链接器的解决方案,谢谢

标签: c macros c-preprocessor conditional-compilation


【解决方案1】:

让链接器完成它应该做的工作。

将函数放入其自己的源文件中,然后将其构建到库中,例如liboptional.a

当需要创建可执行文件时,请使用该库,例如:

gcc -o execfile file1.o file2.o -loptional

当链接器看到-l optional 时,它将使用该库中的对象来满足未定义的引用。因此,如果您使用了file1.ofile2.o 中的函数,它将被包含在内。

【讨论】:

    猜你喜欢
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    • 1970-01-01
    相关资源
    最近更新 更多