Questions tagged «c-preprocessor»

在编译C和C ++语言程序之前应用的文本宏处理器。此标记还可以用于有关其他衍生自或具有相同功能的编译器/语言的问题,例如Objective-C或C#中的#指令。



9
#在Java中定义
我开始用Java编程,并且想知道是否#define存在与C ++等效的语言。 谷歌快速搜索说没有,但是有人可以告诉我Java是否存在类似的东西吗?我正在尝试使代码更具可读性。 而不是myArray[0]我想能够写myArray[PROTEINS]例如。

3
布尔运算符可以与预处理器一起使用吗?
我想知道是否可以使用预处理器OR或AND语句?我有此代码要在_DEBUG或_UNIT_TEST标签(?)下运行。 我想要的是以下内容: #if _DEBUG || _UNIT_TEST //Code here #endif 如果这不可能,是否有一种解决方法来实现相同的目的而不必使用#elseif?复制代码?

18
C宏有什么用?
我已经写了一些C语言,而且我读得足够好,可以大致了解它的功能,但是每次遇到宏时,它都会使我完全失望。我最终不得不记住宏是什么,并在阅读时将其替换在脑海中。我遇到的那些直观易懂的东西总是像小的迷你函数,所以我一直想知道为什么它们不只是函数。 我可以理解需要在预处理器中为调试或跨平台构建定义不同的构建类型,但是定义任意替换的功能似乎仅对使本来就很难理解的语言有用。 为什么为C引入了如此复杂的预处理器?还有没有人有使用它的示例,这会让我理解为什么#debug样式的条件编译时,为什么它似乎仍然用于简单的目的以外的用途? 编辑: 阅读了许多答案后,我仍然听不懂。最常见的答案是内联代码。如果inline关键字不这样做,则它有充分的理由不这样做,或者实现需要修复。我不明白为什么需要一种完全不同的机制来表示“真正内联此代码”(除了在内联之前编写的代码)。我也不理解提到的想法,即“如果它太愚蠢而无法放入函数中”。当然,任何需要输入并产生输出的代码都最好放在函数中。我想我可能不明白,因为我不习惯于编写C的微观优化,但是预处理器感觉就像是解决一些简单问题的复杂解决方案。


9
可以使用C预处理器来判断文件是否存在吗?
我有一个非常大的代码库(阅读:数千个模块),该代码具有在多个项目上共享的代码,这些项目都在具有不同C ++编译器的不同操作系统上运行。不用说,维护构建过程可能会很麻烦。 如果只有一种方法可以使预处理器忽略#includes当前文件中不存在的文件,那么在代码库中有许多地方可以对代码进行实质性的清理。有谁知道实现这一目标的方法? 目前,我们使用了一个#ifdef围绕#include在共享文件,与第二项目特定文件#define语句是否#include存在于该项目。这有效,但是很丑。人们在项目中添加或删除文件时常常会忘记正确更新定义。我已经考虑过编写一个预构建工具来使该文件保持最新状态,但是如果有一种与平台无关的方法来对预处理器执行此操作,则我宁愿那样做。有任何想法吗?


9
是否可以遍历可变参数宏中的参数?
我想知道是否有可能遍历传递给C99中可变参数宏的参数或使用任何GCC扩展? 例如,是否可以编写一个通用宏,该宏将结构及其字段作为参数传递并打印结构中每个字段的偏移量? 像这样: 构造一个{ 诠释 int b; int c; }; / * PRN_STRUCT_OFFSETS将打印每个字段的偏移量 内部结构作为第一个参数传递。 * / int main(int argc,char * argv []) { PRN_STRUCT_OFFSETS(结构a,a,b,c); 返回0; }

9
我应该在标题中使用#include吗?
是否有必要使用#include某些文件,如果在标头(* .h)中使用了此文件中定义的类型? 例如,如果我使用GLib并希望gchar在我的标头中定义的结构中使用基本类型,那么是否#include <glib.h>知道我的* .c文件中已经包含了它,是否有必要做一个? 如果是,我还必须将其放在#ifndef和之间#define或之后#define吗?


6
将预处理器令牌转换为字符串
我正在寻找一种将预处理器令牌转换为字符串的方法。 具体来说,我在某处: #define MAX_LEN 16 我想用它来防止缓冲区溢出: char val[MAX_LEN+1]; // room for \0 sscanf(buf, "%"MAX_LEN"s", val); 我愿意采用其他方式来完成同一件事,但仅限于标准库。

13
是否在行业标准中禁止#define?
我是一年级计算机专业的学生,我的教授说#define的行业标准,以及被禁止#if,#ifdef,#else,和其他一些预处理指令。由于出现意外行为,他使用了“禁止”一词。 这个准确吗?如果可以,为什么? 实际上,是否有任何禁止使用这些指令的标准?

4
如果指令宏比较
为什么#if以下代码中的条件得到满足: #include <iostream> #define VALUE foo int main() { #if VALUE == bar std::cout << "WORKS!" << std::endl; #endif // VALUE }

5
使用宏计算源文件行?
使用C / C ++预处理程序,是否可以将源文件中的行计数为宏或某种编译时可用的值?例如,我可以在下面替换MAGIC1,MAGIC2并MAGIC3在使用时以某种方式获得值4 MAGIC3吗? MAGIC1 // can be placed wherever you like before the relevant // lines - either right before them, or in global scope etc. foo(); MAGIC2 bar(); MAGIC2 baz(); MAGIC2 quux(); MAGIC2 // ... possibly a bunch of code here; not guaranteed to be in same …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.