如何根据已定义字符串的值包含文件或其他文件?
这不起作用:
#define VAR VALUE_A
#if VAR == "VALUE_A"
#include "a.h"
#elif VAR == "VALUE_B"
#include "b.h"
#endif
如果这很重要,我实际上并没有定义VAR
,而是通过gcc -D NAME=VALUE
从命令行传递它。
答案 0 :(得分:4)
您可以将#ifdef
或#ifndef
用于条件包含。
#ifdef VALUE_A
#include "a.h"
#endif
#ifdef VALUE_B
#include "b.h"
#endif
答案 1 :(得分:4)
我能想到的最接近的可能性是利用第三种形式的#include
指令(C11§6.10.2/ 4),即用值定义VAR
,其中包含实际的头文件名:
#define VAR "a.h"
然后使用以下内容:
#include VAR
答案 2 :(得分:4)
==
运算符不会比较字符串。但是,您还可以使用其他几种方法来配置包含。除了在其他答案中已经提到的解决方案之外,我喜欢这个,因为我认为这是不言自明的。
/* Constant identifying the "alpha" library. */
#define LIBRARY_ALPHA 1
/* Constant identifying the "beta" library. */
#define LIBRARY_BETA 2
/* Provide a default library if the user does not select one. */
#ifndef LIBRARY_TO_USE
#define LIBRARY_TO_USE LIBRARY_ALPHA
#endif
/* Include the selected library while handling errors properly. */
#if LIBRARY_TO_USE == LIBRARY_ALPHA
#include <alpha.h>
#elif LIBRARY_TO_USE == LIBRARY_BETA
#define BETA_USE_OPEN_MP 0 /* You can do more stuff than simply include a header if needed. */
#include <beta.h>
#else
#error "Invalid choice for LIBRARY_TO_USE (select LIBRARY_ALPHA or LIBRARY_BETA)"
#endif
您的用户现在可以编译:
$ cc -DLIBRARY_TO_USE=LIBRARY_BETA whatever.c