c-preprocessor相关内容

为什么这个嵌套宏替换失败?

我正在尝试应用 X Macro 概念,以便可以将所有结构成员初始化为自定义默认(无效)值.我写了以下代码: #define LIST_OF_STRUCT_MEMBERS_foo \X(一)\X(b)\X(c)#define X(name) 整数名称;结构富{LIST_OF_STRUCT_MEMBERS_foo};#undef X#define X(名字) -1,静态内联 void foo_inv ..
发布时间:2022-01-11 20:05:45 其他开发

计数预处理器宏

我有这个宏代码,它允许我使用一个构造将 C 枚举和枚举名称列表定义为字符串.它使我不必重复枚举器名称(并可能为大型列表引入错误). #define ENUM_DEFINITIONS(F) \F(0, 项目 1) \F(5, 项目 2) \F(15,第 3 项)\...F(63, ItemN) 然后: 枚举项目{#define ITEM_ENUM_DEFINE(id, name) name = ..
发布时间:2022-01-11 20:05:37 其他开发

#用空格定义

是否可以用空格编写define,例如: #define 在这里替换为替换 我想将“replace to"替换为“replacement here". 编辑: 我想测试私有成员: 我确实写过 #define private public 但它不适用于 Qt 中的私有插槽 所以我打算使用类似的东西 #define 私有槽:公共槽: 无论如何,我找到了另一种测试插槽的 ..
发布时间:2022-01-11 20:05:10 C/C++开发

在带引号的字符串中展开宏

可能重复: C 宏创建字符串 我有一个函数,它接受一个 char* 类型的参数,例如 f("string"); 如果字符串参数是在函数调用中动态定义的,如何在字符串体中展开宏? 例如: #define COLOR #00ff00f("abc 颜色"); 相当于 f("abc #00ff00"); 但是不执行扩展,函数接收字面意思是abc COLOR. 特别是,我需要将 ..
发布时间:2022-01-11 20:02:23 其他开发

了解当宏间接扩展自身时 C 的预处理器的行为

当我在处理一个充满宏技巧和魔法的大型项目时,我偶然发现了一个宏无法正确扩展的错误.结果输出为“EXPAND(0)",但EXPAND被定义为“#define EXPAND(X) X".,所以很明显输出应该是“0". “没问题",我心想.“这可能是一个愚蠢的错误,这里有一些令人讨厌的宏,毕竟有很多地方会出错".正如我所想的那样,我将行为不端的宏隔离到他们自己的项目中,大约 200 行,并开始研究 ..
发布时间:2022-01-11 20:00:23 其他开发

任何用于测试扩展 C/C++ #define 宏的实用程序?

似乎我经常花费太多时间来尝试让#define 宏完全按照我的意愿行事.我将在下面发布我当前的困境,并感谢任何帮助.但实际上更大的问题是是否有人可以推荐任何实用程序来快速显示宏实际在做什么?如果我能看出问题所在,即使是缓慢的试错过程似乎也会变得更快. 目前,我正在从我制作的 DLL 中动态加载一长串函数.按照我的设置方式,函数指针与导出的函数具有相同的名称,用于原型化它们的 typedef(s ..
发布时间:2022-01-11 20:00:16 C/C++开发

为什么不能编译,如何实现它呢?

这是我正在玩的一些 C++ 代码: #include #include #定义输入,#define FOREACH(x,y) for(unsigned int i=0;i 但是,我收到一个错误: 宏“FOREACH"需要 2 个参数,但只有 1 个给定 如果我将 IN 更改为逗号,则代码会编译.如何让 IN 代替逗号? 更新:对于那些感兴趣的人,这 ..
发布时间:2022-01-11 19:58:03 C/C++开发

#define 是否应该在宏周围添加空格?

我在 http://www0.us.ioccc 查看该计划.org/1988/westley.c,在 另一个 SO 答案 - 它应该打印 pi 的值,大约 3.142,但是当我编译并运行它时,我得到 0.250.看起来当 GCC 预处理器(测试的 4.1.2 和 3.4.6)在代码上运行时,它会转换 #define _ -F 到 -F 但我认为,要让程序正常运行,它应该是 -F 即GC ..
发布时间:2022-01-11 19:57:47 其他开发

使用 Fortran 预处理器连接扩展宏和单词

我正在尝试将源代码中的单词与预处理器宏的扩展连接起来.基本上我在代码中的某处有 foo,并且我想通过 #define EXPANSION bar 获得 foobar.但是,我正在努力寻找一种适用于所有编译器的方法.目前,如果它可以与 gfortran 和 ifort 一起使用,我会很高兴. 根据其 文档,gfortran预处理器是在“传统模式"下运行的 C 预处理器,它没有 ## 标记粘贴操 ..
发布时间:2022-01-11 19:57:41 其他开发

X 宏中元素的条件定义

想象一下,我有一个 X Macro 用于定义如下项目的列表: #define X_MACRO(FN) \FN(富)\FN(酒吧) \FN(邮编) 这很好用,我可以调用它来为每个元素生成相同的模板化代码,例如: #define xstr(s) str(s)#define str(s) #s#define PRINT_X(E) void print_ ## E () { std::cout ..
发布时间:2022-01-11 19:57:13 C/C++开发

为什么要在 C 中定义一个名称和内容相同的宏?

我正在查看 Linux 内核头文件中的 if_link.h,它包含以下枚举: 枚举{国际图联UNSPEC,国际图联地址,国际图联广播,IFLA_IFNAME,国际图联_MTU,国际图联_链接,国际图联_QDISC,国际图联统计数据,国际图联成本,#define IFLA_COST IFLA_COST国际图联优先级,#define IFLA_PRIORITY IFLA_PRIORITY国际图联大师 ..
发布时间:2022-01-11 19:56:33 其他开发

检查函数是否用 C 预处理器声明?

是否可以告诉 C 预处理器检查是否声明了函数(不是宏)?我尝试了以下方法,但它似乎不起作用: #include 诠释主要(无效){#if 定义(printf)printf("你支持 printf!\n");#别的puts("要么你不支持 printf,要么这个测试不起作用.");#万一返回0;} 解决方案 没有.预处理器在 C 编译器和 C 编译器处理函数声明之前运行.预处 ..
发布时间:2022-01-11 19:56:22 其他开发

何时使用包括警卫?

我知道在头文件中使用包含保护是为了防止某些东西被定义两次.不过,使用此代码示例完全没问题: foo.c #include #include #include "bar.h"int main() {printf("%d", strlen("测试字符串"));somefunc("一些测试字符串...");返回0;} bar.h #ifndef BAR_ ..
发布时间:2022-01-11 19:55:44 其他开发

C 预处理器:如何创建字符文字?

出于好奇,我想知道是否可以定义一个可以将其参数转换为字符文字的宏: switch(getchar()) {case MYMACRO(A): printf("收到 A\n");休息;case MYMACRO(a): printf("收到一个\n");休息;case MYMACRO(!): printf("收到感叹号\n");休息;默认值:printf("既不是 a 也不是 A 也不是 !\n") ..
发布时间:2022-01-11 19:53:24 其他开发

如何检查参数是否是 C 预处理器宏中的整数常量表达式?

我目前正在清理现有的 C 库以无耻地发布它. 预处理器宏NPOT 用于计算给定整数常量表达式在编译时 的下一个较大的2 次幂.该宏通常用于直接初始化.对于所有其他情况(例如使用可变参数),有一个具有相同功能的内联函数. 但是如果用户传递一个变量,算法就会扩展为一大段机器代码.我的问题是:我可以做些什么来阻止用户向我的宏传递除整数常量表达式之外的任何内容? #define NPOT(x ..
发布时间:2022-01-11 19:52:15 其他开发

求表生成宏成语的好解释

我想提前说明这一点:我知道这个技巧是如何工作的,我想要的是一个链接到一个清晰的解释,以便与他人分享. C 宏问题 谈论“X 宏"或“尚未定义的宏"成语.这涉及定义如下内容: #define MAGIC_LIST \X(名称_1,默认_1)\X(名称_2,默认_2)\... 然后创建一个带有命名索引的值数组: typedef 枚举 {#define X(name, val) 名称,MAG ..
发布时间:2022-01-11 19:52:00 其他开发

使用 __LINE__ 为不同的变量名创建宏

可能重复: 用##和创建C宏LINE(与定位宏的标记连接) 我正在尝试使用 __LINE__ 宏来生成不同的变量名称.我有一个名为 Benchmark 的范围基准类(位于 utils 命名空间中),它的构造函数接受一个字符串.这是我创建的宏定义: #define BENCHMARK_SCOPE utils::Benchmark bm##__LINE__(std::string(__FUN ..

C++ 模板预处理器工具

是否有编译器或独立的预处理器接收 C++ 文件并运行模板扩展传递,生成具有扩展模板实例化的新 C++ 代码? 我记得 90 年代中期这样的工具,当时模板还是新的和实验性的,预处理器是一种在没有原生模板支持的情况下使用编译器进行模板编程的方法. 这比宏处理步骤复杂得多,因为它可能需要解析和标记代码才能理解上下文. 我希望在编写 OpenCL 代码时使用这样的工具.OpenCL 是 ..
发布时间:2022-01-11 19:50:10 C/C++开发