Tag: 元编程

使用C预处理器进行嵌套宏迭代

使用C预处理器,您可以拥有某种高阶宏。 像这样的东西: #define ABC(f) f(a) f(b) f(c) #define XY(f) f(x) f(y) #define CODE(x) foo_ ## x ABC(CODE) #undef CODE #define CODE(x) bar_ ## x XY(CODE) #undef CODE 输出是: foo_a foo_b foo_c bar_x bar_y 是否有一些技巧来嵌套这样的迭代,做这样的事情? #define CODE(x) foo_ ## x NEST(ABC, XY, CODE) #undef CODE 所以输出将是: foo_ax foo_ay foo_bx foo_by foo_cx foo_cy 特别是,我想让ABC和XY的定义相互独立,这样我仍然可以单独使用ABC ,或者甚至可以这样做: #define CODE(x) […]

在编译时查找数组元素位置

– 编辑 – 大家好。 我有一个元素数组,这些元素在程序的所有执行中都不会改变,并且item可以在自己的数组中包含子。 我必须在处理之前准备好arrays。 但是,因为我知道数组不会改变,我想将它声明为const ,并在编译时准备所有这些,所以我可以丢弃整数int son_id[NUM_OF_SONS] , prepare_items()函数和数组在我看来,宣言将更清楚。 #include #include #define NUM_OF_SONS 5 struct item{ int id; char *str; int son_id[NUM_OF_SONS]; const struct item *son[NUM_OF_SONS]; }; const struct item *find_item(int id); static struct item items[] = { {4, “FIRST ELEMENT”}, {5, “SECOND ELM”}, {10, “THIRD ELM”}, {15, “FATHER”, {5,10}}, {0, 0 } […]

模板元编程是否比同等的C代码更快?

模板元编程是否比同等的C代码更快? (我说的是运行时性能):)

C程序可以修改其可执行文件吗?

我手上有点太多时间,开始想知道我是否可以写一个自修改程序。 为此,我在C中编写了一个“Hello World”,然后使用hex编辑器在已编译的可执行文件中查找“Hello World”字符串的位置。 是否可以修改此程序以打开自身并覆盖“Hello World”字符串? char* str = “Hello World\n”; int main(int argc, char* argv) { printf(str); FILE * file = fopen(argv, “r+”); fseek(file, 0x1000, SEEK_SET); fputs(“Goodbyewrld\n”, file); fclose(file); return 0; } 这不起作用,我假设有一些东西阻止它打开自己,因为我可以将它分成两个单独的程序(一个“Hello World”和一些修改它),它工作正常。 编辑:我的理解是,当程序运行时,它被完全加载到ram中。 因此,对于所有意图和目的,硬盘驱动器上的可执行文件都是副本。 为什么修改自己会有问题? 有解决方法吗? 谢谢

编译时__FILE__宏操作处理

我在将一些东西从Solaris移植到Linux时遇到的一个问题是Solaris编译器在预处理期间将宏__FILE__扩展为文件名(例如MyFile.cpp),而Linux上的gcc扩展到完整路径(例如/ home) /user/MyFile.cpp)。 使用basename()可以很容易地解决这个问题但是……如果你经常使用它,那么对basename()的所有调用都必须加起来,对吧? 这是问题所在。 有没有办法使用模板和静态元编程,在编译时运行basename()或类似的? 由于__FILE__是常量且在编译时已知,因此可能更容易。 你怎么看? 可以吗?

我可以使用C / C ++预处理器添加数字吗?

对于一些基地。 基数1甚至。 某种复杂的替代。 此外,当然,在现实生产代码中这样做并不是一个好主意。 我只是出于好奇而被问到。