Tag: c预处理器

在宏定义中使用多个宏

我试图在另一个宏的定义中使用多个宏,但似乎有问题将它们连接在一起。 这是我正在尝试做的非常简化的版本: #include #define PICK_SET_A #ifdef PICK_SET_A #define SET A #endif #ifdef PICK_SET_B #define SET B #endif #define ENABLE_VAR_1_A 1 #define ENABLE_VAR_2_A 1 #define ENABLE_VAR_1_B 0 #define ENABLE_VAR_2_B 0 #define MACRO_RESOLVE(var,set) ENABLE_VAR_##var##_##set #define ENABLE_VAR_1 MACRO_RESOLVE(1, SET) #define ENABLE_VAR_2 MACRO_RESOLVE(2, SET) int main(int argc, char **argv) { fprintf(stdout, “VALUE: %d\n”, ENABLE_VAR_1); return 0; } 我希望结果为0 。 […]

当我想要定义设置1000000时,程序正在崩溃

当我想为SIZE 1.000.000 #define ,我的程序在启动main函数之前崩溃了,但是当我#define为SIZE 100.000时它工作。 我的程序中有两个数组初始化。 #define SIZE 1000000 char *baza_vocka[SIZE]; char b_vocka[SIZE]; 编辑 :他们是局部变量。

在C中使用宏的concat代码

这是事情: 假设我在C中定义了两个函数: test_1() {}; test_2() {}; 我想要一个宏(例如NUM_TEST)来引用测试号。 最好的方法是在代码中显示它: #define NUM_TEST 1 test_1() {}; test_2() {}; int main() { test_ ## NUM_TEST ## () } 我很感激,如果有人会帮忙,找到一个解决方案,如何用宏来连接函数的名称。 编辑: 为了使它更清楚。 我想通过更改test_1()和test_2()之间的“宏NUM_TEST”更改调用函数。 是的我知道有更简单的方法可以做到这一点,但这只是更常见问题的一个例子:如何在C中连接宏而不添加新行或新的宏函数。 编辑2: 显然我现在已经足够清楚了。 假设我写了一个程序。 它有两种(或更多)运行类型。 我有一个叫做NUM_TEST的宏。 通过将提到的宏设置为1或2,想要在test_1()或test_2()之间选择运行类型 谢谢!

如何从另一个函数内的随机位置调用C函数?

谁能告诉我如何在C函数内的随机位置插入函数调用(比如Yield() ),这样每次运行代码时,从代码的不同部分调用Yield() ? 我面临着这样的要求:我在协作线程环境中使用2个线程,除非正在运行的线程明确地产生处理器,否则另一个(等待)线程无法开始运行。 我不想将Yield()调用放在单个点上,因为这会使线程序列具有确定性。 如果不重新布线整个环境(从合作到先发制人),这是我能想到的唯一解决方案,Thread_1()在其中的随机位置调用Yield() ,允许Thread_2()接管。 对于达到相同目标的不同解决方案的任何见解也是受欢迎的!

宏元编程

我知道这可能是坏的或不可能的,但由于这不是一个递归的宏,我认为它应该是可能的。 #define FOO 15 #define MAKE_BAR(x) BAR_##x #define MY_FOO_BAR MAKE_BAR(FOO) 我希望MY_FOO_BAR评估为BAR_15。 有没有办法告诉预处理器在将其传递给MAKE_BAR之前评估FOO?

使预处理器跟踪定义的来源

在一大堆复杂的源代码中(这里没有发明,由Elbonian代码从属程序共同攻击),可能就是几行代码在其路径中有一些公共头文件的本地副本。 由于构建和使用保护宏以防止重新定义的许多层,因此编译器可能会记住一个地方的#defined值,并在其他地方使用,尽管更多的“本地”标题#defining相同的东西。 我的问题是 :我可以让C预处理器吐出文件的名称/路径,它最初“找到”某个东西的定义吗?

错误:没有这样的文件或目录 – C.

解释这个评论后 , /***************** arrayImpl.c **************/ #include”list/list.h” #if defined(ARRAY) …. #endif 我在./Computing/list/arrayImpl.c写了#include”list/list.h” ,用于使用Computing/testList.c程序测试Computing/list ADT,如下所示。 但是list/list.h list/arrayImpl.c找不到list/arrayImpl.c ,如下所示, PC ~/code_practice/Computing $ gcc -Wall -g -DARRAY ./list/*.c testList.c -o testList ./list/arrayImpl.c:3:22: fatal error: list/list.h: No such file or directory compilation terminated. ./list/linkedListImpl.c:3:22: fatal error: list/list.h: No such file or directory compilation terminated. 在关注该评论后,我如何理解这个错误? 我误解了吗?

默认情况下使用unifdef省略未定义的预处理器分支的方法?

我正在使用包含许多编译选项的复杂C代码。 这使得代码非常难以阅读。 我想生成一个反映实际编译方式的代码副本。 我使用“unifdef”实用程序得到了相当不错的结果,直到最近我还不知道。 但是,我很困惑为什么这么难以调用,我想知道我是否遗漏了什么。 考虑这个例子: #ifdef A printf(“A\n”); #endif #ifdef B printf(“B\n”); #endif 如果你使用“unifdef -DA junk.c”调用unifdef,你会得到: printf(“A\n”); #ifdef B printf(“B\n”); #endif 因为你没有告诉unifdef B是未定义的,所以它没有把它拿出来。 我希望该实用程序的行为如此,当我说unifdef -DA时,我得到了: printf(“A\n”); 这将对应于C预处理器实际执行的操作:省略了未定义的任何分支。 要使用unifdef获得此行为,我似乎需要使用“unifdef -DA -UB junk.c”,明确告诉它B未定义。 虽然也许我错过了一种更简单的方式来调用它。 我编写了一个python脚本,从我正在使用的代码的Makefile中生成所需的-D和-U标志的长列表(通常每个例程80个)。 结果非常好。 但我想知道这样的剧本是否真的有必要。 另外一个实用程序(sunifdef?coan?)也可能已经内置了我想要的行为; 如果是的话,请提及。

使用C预处理器生成函数声明

我有很多函数要以这种格式声明: int foo_100(int, int); int foo_200(int, int); int foo_300(int, int); int foo_400(int, int); typedef int (*foo)(int, int); struct foo foo_library[] = { foo_100, foo_200, foo_300, foo_400 }; 有没有办法可以使用C预处理器来部分自动执行此任务? 理想情况下,这样的事情: foo.txt的 100 200 300 400 foo.h中 typedef int (*foo)(int, int); #define DEFINE_FOO(id_) int foo_##id_(int, int); DEFINE_FOO(#include”foo.txt”) struct foo foo_library[] = { #include “foo.txt” };

在C中将变量的值传递给宏

我试图将变量的值传递给C中的宏,但我不知道这是否可行。 例: #include #define CONCVAR(_n) x ## _n int main () { int x0, x1, x2, x3, x4, x5, x6, x7, x8, x9; int i; for (i = 0; i <= 9; i++) CONCVAR(i) = i*5; return 0; } 在这里,我正在尝试使用宏来为所有x_变量赋值,使用##令牌。 我知道我可以通过数组轻松实现这一点,但这仅用于学习目的。 CONCVAR(i)代替xi ,而不是x1 (如果i == 1)。 我知道如何定义和宏工作,它都是关于替换,但我想知道是否有可能将i的值传递给字母i而不是宏。