jjzjj

c-preprocessor

全部标签

python - if 语句范围内的 C++ 宏未编译

我有一些代码应该是线程安全的python/c++api。我正在使用宏Py_BEGIN_ALLOW_THREADS和Py_END_ALLOW_THREADS,它们扩展以创建保存线程状态并创建锁。我在方法退出之前释放锁;一次在if语句范围内,一次在方法范围内。为什么不能编译?它在第二个Py_END_ALLOW_THREADS宏中生成错误:error:_savewasnotdeclaredinthisscope。uint8_tSerialBuffer::push_msg(){#ifdefined(UBUNTU)Py_BEGIN_ALLOW_THREADS#endifif(_type==ARR

c++ - 为什么需要间接寻址

这个问题在这里已经有了答案:CreatingCmacrowith##and__LINE__(tokenconcatenationwithpositioningmacro)(3个答案)关闭6年前。考虑以下宏:#defineCAT(X,Y)X##Y#defineCMB(A,B)CAT(A,B)#defineSLB_LOGGING_ALGORITHMCMB(Logging,SLB_ALGORITHM)其中SLB_ALGORITHM是定义的预处理器符号。如果我直接使用CAT而不是CMB,则SLB_ALGORITHM不会展开。为什么会这样?间接寻址究竟有何帮助?

c++ - 使用 C++ 预处理器的大写字母 (x -> getX/setX)

我想定义一些属性,例如:#defineproperty(T,x)Tx;Tget##x();voidset##x(Tvalue);classfoo{public:property(int,count);property(float,size);}但我希望方法被称为getCount/setCount而不是getcount/setcount。 最佳答案 正如评论所说,你不能那样做。预处理器不会做这些事情。所以你要么按照@Shahbaz在第一条评论中所说的,要么做这样的事情,让你得到和设置get_count和set_count形式。#def

c++ - 编译器预处理期间的数学运算

我经常遇到这样的情况,我需要在编译时生成几个常量以使用位移和屏蔽操作。例如#defineblockbits8#defineblocksize256//couldbegeneratedfrom2^blockbits#defineblocksize0xFF//couldbegeneratedfromblocksize-1我希望所有这些都从blockbits生成,但是据我所知,没有可以在预处理器中使用的幂运算。有人知道在编译时生成这种东西的简单方法吗? 最佳答案 您可以将它们定义为数学表达式:#defineblockbits8#defin

c++ - 避免重新定义预处理器变量

我有各种预处理器变量,它们在不同的库中具有相同的名称。为了避免冲突,我正在做的是(在示例中,为简单起见,只有1个冲突变量和1个header要包含):#ifdefVAR#defineTEMPVARVAR#undefVAR#endif#include"conflictingheader.hh"#ifdefVAR#undefVAR#endif#ifdefTEMPVAR#defineVARTEMPVAR#undefTEMPVAR#endif是否有一种自动存储所有冲突变量、取消定义并在以后恢复它们的方法?或者是否可以定义一个宏来执行这些操作集? 最佳答案

c++ - 如何检查是否定义了类函数宏?

我的代码中有一行看起来像这样:#ifndefMACRO(n)这实际上在大多数编译器上都能正常工作。但是,这在Solaris上失败了,因为官方语法是#ifndefidentifiernew-linegroupopt并且标识符中不允许使用括号。检查这个宏是否被定义的正确方法是什么? 最佳答案 你不需要(n),实际上如果你使用它gcc会报错:warning:extratokensatendof#ifndefdirective这是因为#ifndef需要一个标识符而不是表达式,(n)可能被预处理器忽略只需检查宏定义名称就足够了:#ifndef

C++ 模板预处理器工具

是否有编译器或独立预处理器可以获取C++文件并运行模板扩展过程,从而生成带有扩展模板实例化的新C++代码?我记得在20世纪90年代中期有这样一个工具,当时模板仍然是新的和实验性的,预处理器是一种在没有native模板支持的情况下使用编译器进行模板编程的方法。这比宏处理步骤复杂得多,因为它可能需要解析和标记代码以理解上下文。我希望在编写OpenCL代码时使用这样的工具。OpenCL是C++,但不支持模板。我希望我可以编写模板,即使是简单的模板,比如只有整数或bool参数,并有一些工具预解析文件并通过并找到模板的使用并扩展调用并给我新的C++代码OpenCL编译器可以理解。即使是一个非常有

c++ - 向可变参数宏添加默认参数

是否可以在可变参数宏中的变量参数之前添加默认参数?例如我有类似宏的版本#defineMACRO(arg1,...)func(arg1,##__VA_ARGS__)我想在变量参数之前的宏中再添加2个默认参数,这样它就不会影响以前的版本。喜欢:#defineMACRO(arg1,arg2="",arg3="",...)func(arg1,arg2,arg3,##__VA_ARGS__)如有任何帮助,我们将不胜感激。 最佳答案 我认为这是不可能的。编译器/预处理器如何知道第二个和第三个参数是变量参数的一部分还是覆盖默认值?这就是为什么具有

c++ - 使用预处理器部分处理文件

这个问题在这里已经有了答案:IsthereaCpre-processorwhicheliminates#ifdefblocksbasedonvaluesdefined/undefined?(5个答案)关闭5年前。我们继承了一个非常复杂的项目(500kloc),其中有很多预处理器条件逻辑,其中大部分不再相关,我想清理它。我能否使用预处理器¹仅扩展一些条件逻辑,而将所有其他预处理器宏、定义和包含单独留在输出中?¹在这里,我所说的“预处理器”实际上是指“任何工具”,可以是标准的C预处理器,我可以安装的东西,甚至可以是组合在一起的Perl或Python脚本。例如,假设我们有这组代码:#incl

c++ - 如何挑出发送给仅采用可变参数的宏的第一个参数

我尝试获取发送到可变参数宏的第一个实际参数。这是我尝试过的,但在VS2010中不起作用:#defineFIRST_ARG(N,...)N#defineMY_MACRO(...)decltype(FIRST_ARG(__VA_ARGS__))当我查看预处理器输出时,我看到FIRST_ARG返回发送到MY_MACRO的整个参数列表...另一方面,当我尝试:FIRST_ARG(1,2,3)它按预期扩展为1。这似乎与臭名昭著的两级连接宏所解决的问题在某种程度上相反。我知道“宏参数在插入宏主体之前已完全展开”,但这似乎对我没有帮助,因为我不明白这在......和​​__VA_ARGS__的上下文