jjzjj

c-preprocessor

全部标签

c++ - 使用 g++ 和 specs 文件进行预处理

问题涉及arm-none-eabi-g++6.2和针对newlib-nano的链接。当我使用-specs=nano.specs预处理C源代码时,文件newlib.h来自目录newlib-nano包括:echo'#include'|\/opt/gcc-arm-none-eabi-6_2-2016q4/bin/arm-none-eabi-gcc-specs=nano.specs-xc-E-|\grep'^#1.*newlib\.h'输出#1"/opt/gcc-arm-none-eabi-6_2-2016q4/arm-none-eabi/include/newlib-nano/newlib.

c++ - 展开 C 或 C++ 源文件中的单个宏

我有大量的c++源文件,我想通过扩展我指定的单个函数宏来转换它们,并保持所有其他预处理指令不变。宏的参数通常会涉及括号和大括号以及括号保护的逗号,因此使用sed和kin执行此操作似乎并不直接。更新:我们的代码大量使用宏来生成样板(例如swig的帮助程序代码)。随着我们更好地弄清楚如何做某些事情,各种宏不再做任何非常有趣的事情(例如,只是声明一些函数),许多人提示它们使代码更难阅读。我想扩展那些不太有趣的宏,这些宏可以扩展为简单的C++代码。 最佳答案 我通过在python中使用正则表达式来完成这类事情。您可以编写一个相当短的脚本来处

c++ - 我可以有条件地替换预处理器参数吗?

在使用单元测试框架时,我遇到了一种情况,我想在其中测试宏参数。简单地说,我想扩展宏FOO(x)这样FOO(int)将是short和FOO(anything_else)将是long。有了C++模板,这当然不是问题。但在这里我需要一个真正的token替换,而不仅仅是typedef。IE。FOO(char)FOO(char)i;应该是等于longlongi;的有效定义。 最佳答案 据我所知,C宏中唯一可用的类似字符串的操作是粘贴/连接标记(使用##),以及将它们字符串化(使用#).我很确定你最接近的是像这样列举可能性:#defineFOO

c++ - 我可以安全地使用#ifdef 来了解是否包含 c++ std header 吗?

首先,我读过这个问题:Isthereawaytodetectportablythatastandardheaderisincludedusingmacros?我想知道的是:使用#ifdef检测是否包含c++stdheader的安全性如何,如下面的代码所示:namespaceoverwrite{usingbyte=unsignedchar;templatevoidwithZeros(generic*toBeOverwriten,size_tlength=1){//dostuff}#ifdef_GLIBCXX_RANDOM//foundthismacroinsidetemplatevoid

c++ - C++11如何判断当前函数是普通成员函数还是静态成员函数?

我将尝试解释我正在尝试做的事情:boolif_filter_applies(){returntrue;}#defileLOGFILEif(if_filter_applies())LOG_STREAM_OBJECTvoidglobalFunc(){LOGFILE我正在尝试修改LOGFILE定义,以便它仅在基于if_filter_applies()成员函数的输出从类的成员函数中使用时写入流。如果从类外部或静态成员函数中使用LOGFILE,我希望它使用全局if_filter_applies()函数(它始终返回true)。以上代码无法编译,因为staticvoidstaticMem()最终使用

c++ - 带有尾随注释的多行预处理器宏

我想定义以下看起来很普通的宏:#defineMY_ENUMenumMyEnum{\myVal0,\//DescribesthissituationmyVal2\//Describesthatsituation}令我惊讶的是,由于error:stray‘\’inprogram,这不起作用。甚至反斜杠后的一些空格也会导致warning:backslashandnewlineseparatedbyspace。作为thisanswer指出,反斜杠必须是行中的最后一个字符。Thisanswer指出行拼接发生在注释处理之前。选择这个顺序的原因对我来说完全没有意义;我可以想象这可以做到的唯一原因是允

c++ - 是否可以从 clang 的解析树中提取预处理器信息?

考虑以下简单的头文件demo.h:#definePERSISTstructSerialised{intsomeTransientValue;PERSISTintaNumberToPersist;};我使用以下代码和Clang的pythonAPI来迭代header:importsys,clang.cindexdefcallexpr_visitor(node,parent,userdata):ifnode.location.file:printnode.location.file,node.displayname,node.kindreturn2tu=clang.cindex.Index.

c++ - 如何在预处理时可靠地检测 clang 的版本?

显然,与Xcode捆绑在一起的clang不遵守上游__clang_major__和__clang_minor__值,而是报告某种面向用户的Xcode版本。这里是clang的各种MacPorts安装的值,以供引用。他们似乎尊重上游版本标识符。我在Linux上测试时得到了类似的值。➜prohibit-clang-3.2/opt/local/bin/clang++-mp-3.2-dM-E-xc/dev/null|grep__clang_m#define__clang_major__3#define__clang_minor__2➜prohibit-clang-3.2/opt/local/bi

c++ - 使用预处理器生成默认值

我正在初始化一个包含数千个设置值的非常大的数组。我希望这些值在编译时设置而不是在运行时设置,因为它们是固定的并且不会改变。有没有办法自动生成这些值,也许使用预处理器?目前我正在使用另一个小程序生成这些值,然后简单地分别复制和粘贴这些值。这是我生成的内容:classMyClass{public:MyClass(intx,inty,intz):X(x),Y(y),Z(z){}intX,Y,Z;};std::vectormy_vector{#include"my_vector_default_values.h"};my_vector_default_values.hMyClass(0,0,1

c++ - 如何在#ifdef 中执行宏扩展?

我有一些相当通用的代码,它们使用预处理器宏将某个前缀添加到其他宏上。这是发生的事情的一个非常简化的例子:#defineMY_VAR(x)prefix_##x“prefix_”实际上是在别处定义的,所以每次包含文件时都会不同。它运行良好,但现在我有一些代码,如果其中一个标记不存在,我想跳过,但这不起作用:#ifdefinedMY_VAR(hello)我希望它扩展到的是:#ifdefprefix_hello但是我不知道怎么办。我需要使用MY_VAR()宏来进行扩展,所以我不能只对名称进行硬编码。(它实际上是针对一些测试代码,相同的代码每次都包含不同的前缀来测试一堆类,我想跳过一些类的几个测