考虑这个程序:
函数srand(时间(NULL)); \ if(rand()%2)\ 的printf( “A”); …
要根据模数的结果通过两个随机数进行编译,我们需要使用 BoostPP 。
#include <boost/preprocessor/control/if.hpp> #include <boost/preprocessor/arithmetic/mod.hpp> BOOST_PP_IF(BOOST_PP_MOD(RAND, 2), printf("A"); printf("B");)
你需要使用。编译 -D 分配给的选项 RAND 从 /dev/random ,就像在评论中向你建议的那样。
-D
RAND
/dev/random
以下是条件宏的一些实现细节,让您了解它是如何工作的。模数运算需要在它们上实现数据类型和操作,这在这里很难说明。
#define PRIMITIVE_CAT(a, ...) a ## __VA_ARGS__ #define COMPL(b) PRIMITIVE_CAT(COMPL_, b) #define COMPL_0 1 #define COMPL_1 0 #define CHECK_N(x, n, ...) n #define CHECK(...) CHECK_N(__VA_ARGS__, 0,) #define PROBE(x) x, 1, #define NOT(x) CHECK(PRIMITIVE_CAT(NOT_, x)) #define NOT_0 PROBE(~) #define BOOL(x) COMPL(NOT(x)) #define IIF(c) PRIMITIVE_CAT(IIF_, c) #define IIF_0(t, ...) __VA_ARGS__ #define IIF_1(t, ...) t #define IF(c) IIF(BOOL(c)) #define EAT(...) #define EXPAND(...) __VA_ARGS__ #define WHEN(c) IF(c)(EXPAND, EAT)
和用法。注意 WHEN(0) 不扩展,任何其他 WHEN(arg) 将扩大。
WHEN(0)
WHEN(arg)
WHEN(0) ( \ printf("A"); \ ) WHEN(1) ( \ printf("B"); \ ) WHEN(whatever) ( \ printf("this will expand too"); \ )
查看 高级CPP的简明介绍 随着 此示例中的宏的源 有关上述宏的更多详细信息。
有没有办法在C预处理器中执行任意代码?
不,这是原始(1989)C标准作者的故意设计决定。他们熟悉更强大的宏系统(例如,来自Lisp,它允许在编译时进行任意计算)并且他们认为这些使得难以理解不熟悉的程序意味着什么。
我不清楚你为什么要在编译时做出随机选择。如果您解释了更大的目标,我们可能会更有帮助。
您无法在预处理器中执行代码。但是,您可以创建生成代码的代码:
#include <stdio.h> #include <stdlib.h> #include <time.h> int main() { printf("#include <stdio.h>\n"); printf("\n"); printf("int main()\n"); printf("{\n"); srand(time(NULL)); if (rand() % 2) printf(" printf(\"A\");\n"); else printf(" printf(\"B\");\n"); printf("}\n"); }
输出:
#include <stdio.h> int main() { printf("A"); }
要么:
#include <stdio.h> int main() { printf("B"); }