我已经写了一点C,我可以很好地阅读它以大致了解它在做什么,但每次我遇到一个宏它都完全抛弃了我.我最终必须记住宏是什么,并在我阅读时将其替换为我的脑袋.我遇到的那些直观且易于理解的东西总是像迷你小功能一样,所以我总是想知道为什么它们不仅仅是功能.
我可以理解在预处理器中为调试或跨平台构建定义不同构建类型的需要,但是定义任意替换的能力似乎只对使得已经很难理解的语言更加难以理解.
为什么为C引入了如此复杂的预处理器?并且有没有人有一个使用它的例子,这将使我理解为什么它似乎仍然用于除了简单的#debug风格条件编译之外的目的?
编辑:
读了很多答案之后我还是不明白.最常见的答案是内联代码.如果内联关键字没有这样做,那么它有充分的理由不这样做,或者实现需要修复.我不明白为什么需要一个完全不同的机制,这意味着"真正内联这个代码"(除了形成内联之前编写的代码).我也不明白提到"如果它太愚蠢而不能被赋予功能"的想法.当然,任何需要输入并产生输出的代码都最好放在一个函数中.我想我可能没有得到它,因为我不习惯编写C的微观优化,但预处理器只是对一些简单问题的复杂解决方案.
当我浏览Linux内核时,我找到了一个container_of定义如下的宏:
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
Run Code Online (Sandbox Code Playgroud)
我理解container_of做了什么,但我不明白的是最后一句,也就是说
(type *)( (char *)__mptr - offsetof(type,member) );})
Run Code Online (Sandbox Code Playgroud)
如果我们使用宏如下:
container_of(dev, struct wifi_device, dev);
Run Code Online (Sandbox Code Playgroud)
最后一句的相应部分是:
(struct wifi_device *)( (char *)__mptr - offset(struct wifi_device, dev);
Run Code Online (Sandbox Code Playgroud)
看起来什么都不做.有人可以在这里填补空白吗?
是否需要#include某个文件,如果在标题(*.h)内,使用此文件中定义的类型?
例如,如果我使用GLib并希望gchar在我的标题中定义的结构中使用基本类型,是否有必要执行a #include <glib.h>,知道我已经在我的*.c文件中有它?
如果是,我还必须把它放在#ifndef和#define之后#define?
我知道这WIN32显然是表示win32编译但是需要_WIN32什么?
我想写这样的东西:
#define COV_ON(x) \
#ifdef COVERAGE_TOOL \
_Pragma (COVERAGE #x)
#endif
Run Code Online (Sandbox Code Playgroud)
有没有办法COV_ON像这样定义?我知道我上面做的是错误的,因为我不能#ifdef在#define里面.(#不是允许的角色#define).那么有什么解决方案吗?
如何制作多行预处理器宏?我知道怎么做一行:
#define sqr(X) (X*X)
Run Code Online (Sandbox Code Playgroud)
但我需要这样的东西:
#define someMacro(X)
class X : public otherClass
{
int foo;
void doFoo();
};
Run Code Online (Sandbox Code Playgroud)
我怎样才能让它发挥作用?
这只是一个例子,真正的宏可能很长.
我开始用Java编程,我想知道是否#define存在与C++相当的东西.
谷歌的快速搜索说它没有,但任何人都可以告诉我,如果Java中存在类似的东西吗?我正在努力让我的代码更具可读性.
而不是myArray[0]我想能够写myArray[PROTEINS]例如.
我是一年级计算机专业的学生,我的教授说#define的行业标准,以及被禁止#if,#ifdef,#else,和其他一些预处理指令.由于出乎意料的行为,他使用了"禁止"一词.
这准确吗?如果是这样的话?
事实上,是否存在禁止使用这些指令的任何标准?
在发现Boost预处理器的功能后,我发现自己在想:C99预处理器Turing是否完整?
如果没有,缺少什么不符合资格?
我刚学会了X-Macros.您看过X-Macros的实际用途?他们什么时候成为工作的合适工具?
c-preprocessor ×10
c ×7
c++ ×2
macros ×2
java ×1
linux-kernel ×1
preprocessor ×1
theory ×1
x-macros ×1