jjzjj

c-preprocessor

全部标签

C++ 代码生成

在我让C++做它不应该做的事情的史诗般的探索中,我试图将一个编译时生成的类放在一起。基于预处理器定义,例如(粗略的概念)CLASS_BEGIN(Name)RECORD(xyz)RECORD(abc)RECORD_GROUP(GroupName)RECORD_GROUP_RECORD(foo)RECORD_GROUP_RECORD(bar)END_RECORDGROUPEND_CLASS虽然我相当确定我生成了一个使用这种结构从文件系统读取数据的类(甚至可能使用模板元编程来完成),但我不知道如何生成这两个函数来访问数据和读取数据的函数。我希望以这样的类(class)结束className{

c++ - C/C++预处理器宏可以有默认参数值吗?

这个问题在这里已经有了答案:OptionalParameterswithC++Macros(15个答案)OverloadingMacroonNumberofArguments(10个答案)关闭7年前。我们可以为宏参数指定默认参数值吗?我知道没有任何类型检查,所以我希望默认值只不过是预处理器在未指定参数值的情况下用于宏扩展的一些文本。

c++ - 是否可以使用其他 cpp 文件中的#define?

我认为预处理器会一个接一个地处理文件,但我不知道如何使用include来处理,所以我认为这是不可能的,但很高兴听到其他人的想法。我在a.cpp中有:#defineA1我想在2.cpp中使用它。编辑:我无法修改第一个文件。所以现在我只是复制了定义。但问题仍然悬而未决。 最佳答案 其他翻译单元看不到源文件中的定义。实现文件单独编译。你可以将它们放在标题中并包含在内使用编译器的选项以理智的方式去做-externconstintA=1;在一个实现文件中,并在你想使用它时声明它externconstintA;。其中,我会说第一个选项可能是您可

c++ - 如何将宏的定义获取为字符串文字?

在标题中说,我不想自己阅读但我确实包含了标题#defineAB#defineBC现在#defineSTR(name)#name定义一个宏,以字符串形式给出任何宏的名称,并且#defineEXP_STR(name)STR(name)定义了一个宏,让我可以将任何宏完全扩展为一个字符串。所以cout将打印AC。有没有办法使用一些宏从A获取"B"? 最佳答案 既然你会写#defineBC#defineAB#defineSTR(name)#name#defineEXP_STR(name)STR(name)和cout会输出完全相同的,这意味着不

C++ 预处理器删除可变参数宏调用中的空格 (Solaris Studio 12.3)

OracleSolarisStudio12.3的C++预处理器在扩展__VA_ARGS__时完全删除了空格。任何人都可以在他们的系统上确认这种行为吗?这是一个已知的编译器错误吗?这个问题有什么解决方法吗?为了说明,这里有一个简单的测试程序,vaargs.c:#include#definePRINT(...)printf("%s\n",#__VA_ARGS__)intmain(){PRINT(helloworld);return0;}C预处理器按预期工作:$ccvaargs.c-ovaargs&&./vaargshelloworld$cc-Vcc:SunC5.12SunOS_i38620

c++ - C 预处理器在多大程度上考虑整数文字后缀?

今天,我偶然发现了这样的事情:#defineFOO2u#if(FOO==2)unsignedintfoo=FOO;#endif不管代码为何如此(让我们不要质疑为什么),我想知道预处理器甚至可以在多大程度上处理整数文字后缀。我真的很惊讶它能起作用。用GCCandC99做了一些实验后使用此代码...#includeintmain(){#if(1u==1)printf("1u==1\n");#endif#if(1u+1l==2ll)printf("1u+1l==2ll\n");#endif#if(1ull-2u==-1)printf("1ull-2u==-1\n");#endif#if(1u

c++ - #定义空格

是否可以用空格来编写定义,例如:#definereplacetoreplacementhere我想用“replacementhere”替换“replaceto”。编辑:我想测试私有(private)成员:我确实写过#defineprivatepublic但它不适用于Qt中的私有(private)槽所以我打算使用类似的东西#defineprivateslots:publicslots:无论如何,我已经找到了另一种测试插槽的方法,顺便说一句,我知道这是一个丑陋的hack。 最佳答案 不,你不能#defineidentifiersomet

c++ - 类似于 "if constexpr"但用于类定义

ifconstexpr是在C++程序中摆脱预处理器的一大步。然而,它仅适用于函数-如本例所示:enumclassOS{Linux,MacOs,MsWindows,Unknown};#ifdefined(__APPLE__)constexprOSos=OS::MacOs;#elifdefined(__MINGW32__)constexprOSos=OS::MsWindows;#elifdefined(__linux__)constexprOSos=OS::Linux;#elseconstexprOSos=OS::Unknown;#endifvoidprintSystem(){ifcons

c++ - 如何使用#includes 强制 Visual Studio 预处理器区分大小写?

如果您有一个名为ThisIsAHeaderFile.h的头文件,以下仍将在VisualStudio中找到该文件:#include有没有办法强制区分大小写,以便#include会导致错误? 最佳答案 你不能,因为Windows文件系统本身是不区分大小写的。如果您遇到同时拥有RICHIE.h和richie.h的情况,那么控制区分大小写可能有意义,但您不能。 关于c++-如何使用#includes强制VisualStudio预处理器区分大小写?,我们在StackOverflow上找到一个类似的

c++ - move 操作的条件编译

如何检查我的编译器是否支持右值引用?是否有标准的预处理器宏,或者不同的编译器有不同的宏?理想情况下,我想这样写:#ifdefRVALUE_REFERENCES_SUPPORTEDfoobar(foobar&&that){//...}#endif 最佳答案 我不知道有任何标准的预处理器宏,但是:VisualStudio在VC2010引入了支持,内部版本是1600,可以用_MSC_VER>=1600查看自version4.3以来,GCC一直支持右值引用,因此您可以检查该版本以及__GXX_EXPERIMENTAL_CXX0X__Clan