相关疑难解决方法(0)

暂时覆盖C预处理器中的宏

我需要暂时覆盖一个宏,然后恢复它.喜欢:

#define FOO X
#save FOO
#define FOO Y
...
#restore FOO
Run Code Online (Sandbox Code Playgroud)

是否可以在标准C预处理器中使用?在GCC?

添加.关于现实世界的例子.我使用全局宏来表示错误异常.它的作用类似于assert持久使用,不仅适用于调试版本; 所以,例如,我通常在宏内调用函数(带副作用).它定义了一次,但定义并不持久; 因此,我不知道它是先验的.对于一些一段代码,我需要自己的,修改宏的版本,但我想保存的代码大将风范.当一部分代码使用一个宏时,它看起来很丑陋,其他部分使用其他宏 - 两个宏具有相同的目的,但实现略有不同.

因此,暂时保存原始宏,对代码的一部分使用不同版本,然后恢复原始宏是很好的.

c c-preprocessor

20
推荐指数
2
解决办法
8309
查看次数

如何"禁用"从C-Header导入的宏

A类使用用C编写的库.这个库提供了一些在A中使用的数据类型和常量.不幸的是,该库还在其头文件中定义了宏,它与main.cpp或其他使用A的类中的C++代码冲突.

当Ah被包含在某处时,如何防止执行c_library.h的宏?我也愿意接受架构改变,但我宁愿不接触C库.

当然,还有#undef指令.但这意味着每个宏或每次碰撞都会进行大量的手动操作.(好吧,没有太多 - 但嘿,这一定可能更优雅吗?)

码:

//main.cpp

#include "A.h"

...
A a(...)
...
std::max(x, y); // oops, problem since max is defined as macro in c_library.h
...

//A.h
#include "c_library.h"

class A{
public:
    A(...);
    static void callbackForCLibrary(datatypeOfCLibrary d){...}
private:
    private datatypeOfCLibrary1;
    private datatypeOfCLibrary2;
}
Run Code Online (Sandbox Code Playgroud)

c c++ c-preprocessor

14
推荐指数
5
解决办法
1570
查看次数

抑制C宏变量替换

我有这段代码(实际上是垃圾收集的Forth系统的解释器的一部分):

#define PRIMITIVE(name) \
    do \
    { \
        VocabEntry* entry = (VocabEntry*)gc_alloc(sizeof(VocabEntry)); \
        entry->code = name; \
        entry->name = cstr_to_pstr(#name); \
        entry->prev = latest_vocab_entry; \
        latest_vocab_entry = entry; \
    } \ 
    while (false)

PRIMITIVE(dup);
PRIMITIVE(drop);
PRIMITIVE(swap);
// and a lot more
Run Code Online (Sandbox Code Playgroud)

但是有一个问题:在线

entry->name = cstr_to_pstr(#name);
Run Code Online (Sandbox Code Playgroud)

name字段被取代dup,drop,swap,和其余部分.我希望字段名称不被替换.

那么,有没有办法解决这个问题,除了简单地重命名宏参数?

作为答案,请解释一般是否有一种方法来抑制宏体中宏参数名称的替换.不要回答"只是这样做"(请).

c substitution c-preprocessor

7
推荐指数
2
解决办法
2383
查看次数

标签 统计

c ×3

c-preprocessor ×3

c++ ×1

substitution ×1