c-preprocessor相关内容
我经常并且经常觉得宏定义中的一些围绕参数的括号是多余的.把所有东西都括起来太不方便了.如果我可以保证参数不需要括号,我可以省略括号吗?还是强烈推荐将它们都括起来? 我在写的时候想到了这个问题: #define SWAP_REAL(a, b, temp) do{double temp = a;a = b;b= 温度;}while(0) 我认为如果一个参数作为左值出现在宏中,括号可以省略,因
..
在标准 C 或 GNU 扩展中是否有任何方法可以将内容附加到宏定义中?例如,给定一个定义为 的宏#define List foo bar 我可以附加 bas 以便它 List 像我定义它一样扩展 #define List foo bar bas? 我希望我能做这样的事情: #define List foo bar bas#define List_ Expand(列表)#undef 列
..
#include 文件名(在 C 中)时,是否可以连接来自另一个宏的字符串.例如, 我有, #define AA 10#define BB 20 这些是随着程序运行而变化的参数 文件包括: #include "file_10_20"//这会相应改变,即 file_AA_BB 是否有可能以某种方式拥有类似 #include "file_AA_BB" 的东西?我用谷歌搜索发现双磅运
..
在重构代码并摆脱所有那些我们现在被教导讨厌的#defines 时,我发现了这种用于计算结构中元素数量的美感: #define STRUCTSIZE(s) (sizeof(s)/sizeof(*s)) 它非常有用,但它可以转换成内联函数或模板吗? 好的,ARRAYSIZE 会是一个更好的名字,但这是遗留代码(不知道它来自哪里,它至少有 15 年的历史)所以我按“原样"粘贴它. 解决方
..
有人知道任何 C99 预处理器魔法,它允许创建一个由另一个重复 N 次的字符串组成的字符串吗? 例如 STRREP("%s", 3 ) 变成 "%s %s %s" 预处理后. 我唯一能想到的就是这样 #define STRREP(str, N) STRREP_##N(str)#define STRREP_0(str) ""#define STRREP_1(str) str#d
..
为了使我的代码更短更容易更改,我想替换类似的东西 枚举{ E_AAA, E_BBB, E_CCC };静态 const char *strings{"AAA", "BBB", "CCC" }; 使用宏,例如 INIT(AAA, BBB, CCC);但是当我尝试使用可变参数和字符串化做一个宏时,我得到一个错误,因为没有声明参数. 你知道怎么做吗? 解决方案 这是我前几天学到的一个解
..
我想知道是否有一个通用的 ELEM 比较宏,其中: (v == a || v == b) 可以替换为: ELEM(v, a, b) 当然这可以通过宏来完成, #define ELEM(v, a, b) (((v) == (a)) || ((v) == (b))) 但是,您最终需要使用参数计数定义多个宏. 使用一个简单的 python 脚本我想出了这个:
..
我正在使用一些宏,并观察到一些奇怪的行为. 我将 PI 定义为一个常数,然后在宏中使用它来将度数转换为弧度,将弧度转换为度数.度数到弧度可以正常工作,但弧度到度数不能: piTest.cpp: #include #include 使用命名空间标准;#define PI atan(1) * 4#define 弧度(度)度 * PI/180#define
..
用于连接的 C 预处理器宏 (##) 似乎不适用于使用 gfortran 的 Mac.在其他系统上使用其他 Fortran 编译器可以工作,所以我正在寻找 gfortran 的解决方法.我必须使用 ## 来创建许多变量,所以我不能没有它们. 示例代码: #define CONCAT(x,y) x##y程序主整数,参数:: CONCAT(ID,2) = 3打印*,“你好",ID_2结束程序主
..
这个问题是在一次模拟面试中被问到的......真的很惊讶地发现了尴尬的答案...... 考虑一个宏: #define SQR(x) (x*x) 示例 1: SQR(2)//打印 4 示例 2: 如果给定 SQR(1+1),它不会将 (1+1) 与 2 相加,而是... SQR(1+1)//打印 3 尴尬吧?是什么原因?这段代码是如何工作的? 注意:我搜索了 SO,但找
..
我想让 C 预处理器为我生成宏(即,我只使用 C99).我会写一个宏 #define make_macro(in) 当我放的时候 make_macro(name1)make_macro(name2) 在后面的代码中,它会扩展为 #define name1(...) name1_fn(name1_info, __VA_ARGS__)#define name2(.
..
我正在尝试执行某种宏“重载",以便 MACRO(something) 的扩展方式与 MACRO(something, else) 不同. 使用我从 这里获得的片段(我是不确定它是否 100% 可移植)和 Boost PP 库中的一些功能,我能够让它工作:D //这两个计算参数的数量#define VA_NARGS_IMPL(_1, _2, _3, _4, _5, N, ...) N#def
..
在这个问题的答案之一中jalf 谈到了有用的定义 NOMINMAX,它可以防止不需要的定义 min/max 宏.是否有其他有用的定义可以帮助控制 windows.h(或其他 Windows 标头,例如 Microsoft C 运行时标头或 STL 实现)行为? 解决方案 最常用的可能是 WIN32_LEAN_AND_MEAN - 它禁用 API 中很少使用的部分.您可以在 MSDN 的 使
..
有没有办法定义一个包含 #include 的宏指令在其正文中? 如果我只是把“#include",它给出了错误 C2162: "预期的宏形式参数" 因为这里我没有使用 # 来连接字符串. 如果我使用“\# include",则会收到以下两个错误: error C2017: 非法转义序列错误 C2121:“#":无效字符:可能是宏扩展的结果 有什么帮助吗? 解决方案 所以就像
..
可能重复: 谜语(C语言) 我对以下代码段有几个问题: #include#define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0]))int 数组 [] = {23,34,12,17,204,99,16};主函数(){诠释d;for(d=-1;d 这里的代码输出没有按预期打印数组元素.但是当我添加 (int) 的类型转
..
如何编写扩展为包含换行符的 cpp 宏? 解决方案 我正在做一个大型项目,该项目涉及大量预处理器宏函数来合成任何无法被模板替换的代码.相信我,我熟悉各种模板技巧,但只要没有可以直接创建代码的标准化、类型安全的元编程语言,我们将不得不坚持使用好的旧预处理器及其繁琐的宏来解决一些问题如果没有,则需要编写十倍以上的代码.一些宏跨越多行,在预处理代码中很难阅读.因此,我想到了解决该问题的方法,我想
..
我试图弄清楚我的代码认为它正在使用哪个版本的 Boost.我想做这样的事情: #error BOOST_VERSION 但预处理器不会扩展 BOOST_VERSION. 我知道我可以在程序运行时将其打印出来,并且我知道我可以查看预处理器的输出来找到答案.我觉得在编译期间有一种方法会很有用. 解决方案 我知道这是在原始查询之后的很长一段时间,但这可能仍然有用. 这可以
..
我有以下代码 #define myfunc(a,b) myfunc(do_a(a), do_b(b))无效myfunc(int a,int b){do_blah(a,b);}主函数(){整数 x = 6, y = 7;我的函数(x,y);返回0;} 我希望预处理器仅在调用时扩展函数 myfunc.预处理后所需的代码如下所示: void myfunc(int a, int b){do_blah
..
替代标题(帮助搜索) 将预处理器标记转换为字符串 如何从 C 宏的值中生成字符字符串? 原始问题 我想在编译时使用 C #define 来构建文字字符串. 字符串是为调试、发布等而更改的域. 我想要一些这样的东西: #ifdef __TESTING#define IV_DOMAIN domain.org//内部测试#elif __LIVE_TESTING#defi
..
当使用 C 预处理器时,可以像这样对宏参数进行字符串化: #define TO_STRING(x) "带有 " #x 的字符串 等使用时,结果如下: TO_STRING(test) 将扩展为:"a string with test" 有什么方法可以反其道而行之吗?获取字符串文字作为输入参数并生成 C 标识符?例如: TO_IDENTIFIER("some_identifier
..