jjzjj

c-preprocessor

全部标签

c++ - c++什么时候需要用#include

我已经编程了一段时间了,但我仍然没有完全弄明白的一件事就是您何时需要#include某些东西。我知道为了安全起见,只要您使用另一个文件中声明的内容,就可以这样做。然而,有时我发现我可以删除一个#include并且一切仍然可以正常编译。据我所知,这是因为包含的其他文件已经包含了外部定义。我有兴趣了解以下两种特殊情况的行为:假设我们有三个.h/.cc对:f1.h/.cc、f2.h/.cc和f3.h/.cc。如果f2.h/.cc包含f1.h而f3.h/.cc包含f2.h是否有必要让f3.h/.cc包含f1.h或者f1.h的所有定义是否对f3文件包含在f2中时?再次假设我们有三个.h/.cc对

c++ - #elif 定义时没有括号

使用带有BLAH_BLAH的VS2005定义了以下预处理器条件为假:#elifdefinedBLAH_BLAH但是如果我把它改成#elifdefined(BLAH_BLAH)这是真的。为什么括号在这里有所不同? 最佳答案 它应该没有任何区别,除非BLAH_BLAH被定义为有趣的东西。 关于c++-#elif定义时没有括号,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/522378

c++ - GCC 的 _Pragma 运算符中的预处理器标记粘贴

我正在尝试做类似于anotherquestion的事情,即有条件地在我的程序中包含OpenMP编译指示。但是,我想更进一步,避免用户每次使用pragma时都需要指定omp。换句话说,我希望编译以下代码:#include#include#ifdef_OPENMP#defineLIB_PRAGMA_OMP(x)_Pragma("omp"#x)#else#defineLIB_PRAGMA_OMP(x)#endifintmain(){LIB_PRAGMA_OMP(parallel){std::printf("Hellofromthread%d\n",omp_get_thread_num());

c++ - 是否有某些关键字不应该是我的 "#defined"?

我正在用C/C++为我的应用程序开发一个平台层。我愿意#defineWINDOWS//在Windows机器上#defineANDROID//在Android手机上由于与其他库的冲突,定义诸如“WINDOWS”或“ANDROID”之类的非常常见的关键字是不是一个坏主意,是否可以在这些关键字前加一些前缀:#defineMYLIB_WINDOWS//不被任何其他3rdparty库使用#defineMYLIB_ANDROID 最佳答案 Iwouldliketo当心在你的库的头文件中公开带有“通用”名称的宏。还要注意私有(private)代码

C++ 匿名变量

为什么这行不通?0.#defineCONCAT(x,y)x##y1.2.#defineVAR_LINE(x)\3.intCONCAT(_anonymous,__LINE__)=x4.5.#defineVAR_LINE2(x)\6.int_anonymous##x=17.8.intmain()9.{10.VAR_LINE(1);11.VAR_LINE(1);12.VAR_LINE(1);13.VAR_LINE2(__LINE__);14.}上述宏展开的结果int_anonymous__LINE__=1;int_anonymous__LINE__=1;int_anonymous__LINE

c++ - Objective-C 预处理器定义,动态 C 字符串到 NSString 声明

我正在尝试创建一个可以根据上下文发出C++或Objective-C的宏定义,但似乎无法轻松地在宏中构造NSString。C++版本很简单,因为它使用常规字符串,但事实证明制作一个发出NSString的字符串很棘手:#defineFOO(x)bar(@##x)预期的结果是通过使用@前缀将字符串参数转换为NSString参数:FOO("x")//=>bar(@"x")我得到的是一个阻止编译的错误:Pastingformed'@"x"',aninvalidpreprocessingtoken 最佳答案 NSString*x=@"text"

c++ - 在哪里指定预处理器指令是合法的?

我正在尝试编写一个状态机,它可以读取源文件并将其拆分为编译器业务或预处理器业务的部分。不是深度遍历,我只是在寻找注释或预处理器指令的部分。(没有宏,没有条件编译block等)注释很简单,但我不能100%确定在何处指定预处理器指令是合法的。例如,下面一行是否合法?inti;#include是否存在允许某些指令而其他指令不允许的特殊情况?我搜索了谷歌和SO,但没有找到可以回答这个问题的问题。请同时回答C和C++,我是有意和有意标记的。 最佳答案 预处理器指令可以出现在任何地方,只要它们是行中的第一个非空白标记即可。因此,你不能写inti

c++ - 预处理器输出文件是否为有效的 C/C++ 文件

我有2个文件作为qwe.h#ifndefQWE_H#defineQWE_H//#includeintasd();#endifqwe.cc#include"qwe.h"intasd(){std::cout仅作为g++-Eqwe.cpp>op4运行预处理器给出以下输出#1"qwe.cpp"#1""#1""#1"qwe.cpp"#1"qwe.h"1intasd();#2"qwe.cpp"2intasd(){std::cout预处理器输出不应该是有效的C/C++文件吗?语句“#intstringint”的含义是什么 最佳答案 它们是行号,用

c++ - 哪些用例需要 #define 而不使用标记字符串?

之前在学习C的时候遇到过#define预处理器指令,后来在看的一些代码中也遇到过。但是除了用它来确定常量的替换和定义宏之外,我还没有真正理解它在没有“主体”或标记字符串的情况下使用的特殊情况。以这一行为例:#defineOCSTR(X)就是这样!这个或更好的用途是什么,什么时候需要使用#define? 最佳答案 这用于两种情况。第一个也是最常见的涉及条件编译:#ifndefXYZ#defineXYZ//...#endif你肯定自己用过它来包含守卫,但它也可以是用于诸如系统依赖之类的事情:#ifdefWIN32//Windowsspe

c# - 在 C# 代码中重用 .h 文件中的定义语句

我有一个C++项目(VS2005),它在#define指令中包含带有版本号的头文件。现在我需要在双C#项目中包含完全相同的数字。最好的方法是什么?我正在考虑将此文件作为资源包含在内,然后在运行时使用正则表达式对其进行解析以恢复版本号,但也许有更好的方法,您认为如何?我不能将版本移到.h文件之外,构建系统也依赖于它,C#项目是一个应该调整的项目。 最佳答案 我会考虑使用.tt文件来处理.h并将其转换为.cs文件。这非常简单,源文件将成为您的C#解决方案的一部分(这意味着它们将随着.h文件的更改而刷新),可以单击以在编辑器中打开,等等。