Tag: c preprocessor

对于在预处理器阶段展开的循环宏?

我想使用gcc预处理器编写几乎相同的代码声明500次。 让我们说出于演示目的,我想使用宏FOR_MACRO : #define FOR_MACRO(x) \ #for i in {1 … x}: \ const int arr_len_##x[i] = {i}; 并调用FOR_MACRO(100)将转换为: const int arr_len_1[1] = {1}; const int arr_len_2[2] = {2}; … const int arr_len_100[100] = {100};

在struct中使用typedef来命名和索引文本命令

我正在使用一个简单的命令行应用程序,它接收ASCI文本并将其解释为命令。 我试图通过http://gcc.gnu.org/onlinedocs/cpp/Concatenation.html上的示例来最小化此应用程序中的冗余。 例如:考虑一个解释命名命令的C程序。 可能需要一个命令表,可能是一个声明如下的结构数组: struct command { char *name; void (*function) (void); }; struct command commands[] = { { “quit”, quit_command }, { “help”, help_command }, … }; 如果必须给每个命令名两次,一次在字符串常量中,一次在函数名中,则更清楚。 将命令名称作为参数的宏可以使其不必要。 字符串常量可以使用字符串化创建,函数名称可以通过将参数与`_command’连接来创建。 以下是它的完成方式: #define COMMAND(NAME) { #NAME, NAME ## _command } struct command commands[] = { COMMAND (quit), COMMAND (help), … }; 现在,假设我想要一个命令字符串和索引(即:int)值,而不是字符串和函数指针。 struct command { […]

推荐保留预处理器指令的C前端

我想开始一个涉及转换C代码的项目,但我想要包含预处理器指令。 我不想通过编写自己的C解析器重新发明轮子,所以有人知道可以解析C预处理器和C代码的前端,并产生一个可以用来重新生成的AST(或者漂亮的 -打印)原始来源? 例如,: #define FILENAME “filename” #include FILE *f=0; … if (file_is_open) { #ifdef CAN_OPEN_IT f = fopen(FILENAME, “r”); #else printf(“Unable to open file.\n”); #endif } 应将上述代码解析为一些可用于重新生成源的内存中表示。 换句话说,它不应该在两个阶段中作为普通C处理,首先处理PP指令然后解析纯C代码。 相反,它应该代表整个编译时逻辑,包括预处理器变量。

为什么编译器抱怨这个宏声明

为了调试方便,我编写了下面的宏, 1 #ifndef DEF_H 2 #define DEF_H 3 #define DEBUG_MODE 4 #define DEBUG_INFO(message) \ 5 #ifdef DEBUG_MODE \ 6 cout << message << endl; \ 7 #endif \ 8 #endif 但gcc抱怨如下 def.h:4: error: ‘#’ is not followed by a macro parameter def.h:1: error: unterminated #ifndef 这段代码出了什么问题? 我在这里错过了一些重点吗?

“_IO(…)”在Linux中的C头文件中意味着什么?

我有一个Linux标准头文件,例如 /usr/src/linux-headers-3.2.0-35/include/linux/usbdevice_fs.h 其中包含如下的define语句: #define USBDEVFS_SUBMITURB32 _IOR(‘U’, 10, struct usbdevfs_urb32) #define USBDEVFS_DISCARDURB _IO(‘U’, 11) #define USBDEVFS_REAPURB _IOW(‘U’, 12, void *) ‘_IOR’,’_IO’和’_IOW’是什么意思? 实际给出了什么值,例如USBDEVFS_DISCARDURB ?

在预处理器中从常量中删除强制转换

背景 在微控制器代码中,我使用的是生产者提供的库,其中定义了许多常量。 如果我的一些常量(与微控制器之外的组件共享,使用git-subtree )和微控制器常量之间存在不匹配,我试图给出错误。 例如,库定义: #ifdef SOME_PARTICULAR_MODEL #define FLASH_BLOCK_SIZE ((uint8_t)64) /* else, other models */ #endif 在某处,在微控制器代码和PC上编译的一些代码之间共享的标题中,我有例如: #define MYPROG_BLOCK_SIZE 64 为了确保这些常量匹配,在微控制器代码中,两个常量都存在,我有: #if MYPROG_BLOCK_SIZE != FLASH_BLOCK_SIZE #error “mismatch between actual block size and defined block size” #endif 这是为了确保代码是否曾被移植到更大的微控制器,共享头也将被更新。 问题 问题是这会减少到: #if 64 != ((uint8_t)64) 我不确定它是否是有效的C ,但仍然使编译器窒息。 测试,我发现问题不在于uint8_t是一个typedef,并且它仍然会被一个强制转换为int ,例如。 问题 有没有办法从定义为((uint8_t)64)的值中删除(uint8_t)部分? 如果没有,有没有办法改变它,所以表达式变成一个没有演员? 我想过将uint8_t定义为某些内容并在#if之后取消定义它,但我无法弄清楚如何避免(Y)X转换性质并将其转换为算术表达式。

预处理器:将字符串连接到__VA_ARGS__中的每个参数

我想将一个字符串化的宏参数附加到可变参数宏中的每个元素。 我想我知道我需要什么,但我还没有想出一个有效的解决方案。 鉴于可变宏,如: #define FIELD_DECLARATION(NAME, OTHER_FIELD, …) FIELD_DECLARATION(First, Thing) FIELD_DECLARATION(Second, Thing, Thing, Nothing) 我想生成: field_First = {ThingArg}; field_Second = {ThingArg, ThingArg, NothingArg}; 我想我需要的是递归地继续扩展__VA_ARGS__直到它没有元素,并在进行扩展时附加”Arg” 。 最后,将结果传递给另一个可变参数宏,该宏生成以逗号分隔的参数列表。 我试过这个,这是行不通的(也不是我所描述的): #define UNPACK_VA_1(A1) A1 ## Arg #define UNPACK_VA_2(A1, A2) UNPACK_VA_1(A1), UNPACK_VA_1(A2) #define UNPACK_VA_3(A1, A2, A3) UNPACK_VA_2(A1, A2), UNPACK_VA_1(A3) #define UNPACK_VA_4(A1, A2, A3, A4) UNPACK_VA_2(A1, A2), UNPACK_VA_2(A3, A4) #define UNPACK_VA(…) UNPACK_VA_4(__VA_ARGS__) […]

c中的##是什么?

我看过这个片段: #define kthread_create(threadfn, data, namefmt, arg…) \ kthread_create_on_node(threadfn, data, -1, namefmt, ##arg) ##代表什么? ##出现在宏外时是什么意思?

C预处理器:尽早评估宏

请考虑以下设置: 啊 #define A 5 #define BA #undef A #define A 3 AC #include “ah” #include int main() { printf(“%d\n”, B); return 0; } 虽然这非常合理地打印3,有没有办法让它打印5,即在第二行啊已经替换为5的A?

C宏启用和禁用代码function

我之前使用过代码库,它有一个宏系统,用于启用和禁用代码段。 它看起来像下面这样: #define IN_USE X #define NOT_IN_USE _ #if defined( WIN32 ) #define FEATURE_A IN_USE #define FEATURE_B IN_USE #define FEATURE_C NOT_IN_USE #elif defined( OSX ) #define FEATURE_A NOT_IN_USE #define FEATURE_B NOT_IN_USE #define FEATURE_C IN_USE #else #define FEATURE_A NOT_IN_USE #define FEATURE_B NOT_IN_USE #define FEATURE_C NOT_IN_USE #endif 然后,function的代码如下所示: void DoFeatures() { #if USING( FEATURE_A ) // Feature […]