小编a3f*_*a3f的帖子

抑制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
查看次数

macro:来自char literal的字符串文字

在C中是否有办法使用宏从字符文字创建字符串文字?

比如我有

'a'
Run Code Online (Sandbox Code Playgroud)

我想创建字符串文字

"a"
Run Code Online (Sandbox Code Playgroud)

澄清问题:

#define A 'a'

write(fd, "x=" CHAR2STRING(A) "\n", 4);
Run Code Online (Sandbox Code Playgroud)

我的问题是如何定义宏CHAR2STRING

c c-preprocessor

7
推荐指数
1
解决办法
1416
查看次数

什么是消除默认/删除移动/复制语义所涉及的样板的好方法?

斯科特迈耶斯对零规则有一个很好的观点.基本上他主张默认移动/复制分配/构造你是否真的需要它们.基本上一般的经验法则是避免编译器生成这些成员,主要是因为它们是混淆的一个重要来源(我同意这一点).

因此,我正在考虑如何将类定义为默认的可移动,可复制或不可移动,不可复制的良好通用实践.我想到了boost,boost::noncopyable但我不喜欢为这样一个功能目的引入继承的想法.

我能想到的唯一有意义的是使用宏.所以我提出了这样的事情:

/// Disable copy construct/assign for the given class T
#define CLASS_NON_COPYABLE(T) \
   T(T const&) = delete; \
   T& operator=(T const&) = delete

/// Disable move construct/assign for the given class T
#define CLASS_NON_MOVABLE(T) \
   T(T&&) = delete; \
   T& operator=(T&&) = delete

/// Disable both copy and move construct/assign for the given class T
#define CLASS_NON_COPYABLE_OR_MOVABLE(T) \
   CLASS_NON_COPYABLE(T); \
   CLASS_NON_MOVABLE(T)

/// Default copy move/assign
#define CLASS_DEFAULT_COPYABLE(T) \
   T(T const&) = default; …
Run Code Online (Sandbox Code Playgroud)

c++ boost c-preprocessor c++11

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

在没有预处理器的情况下展开C/C++函数宏

如何在C/C++文件中测试/扩展所有函数宏,而不通过预处理器运行它?例如,是否有一个程序或方法可以改变这个:

#include <iostream>
#define AAA(a) cout << "function "  << a << endl
using namespace std;
int main(){
AAA(12);
}
Run Code Online (Sandbox Code Playgroud)

进入这个?

#include <iostream>
using namespace std;
int main(){
cout << "function " << 12 << endl;
}
Run Code Online (Sandbox Code Playgroud)

我不想运行预处理器,因为文件中的所有包含使得"gcc -E <>"输出真的很难看,我只想要几个简单的宏扩展而没有所有的开销.

c++ c-preprocessor

7
推荐指数
1
解决办法
927
查看次数

C macro:将数字转换为字符串

我有一个表格,用于在5x7点显示屏上定义符号外观.就像是:

extern UINT8 symbols[][5] = {
    {0x0,0x0,0x0,0x0,0x0},
    {0x0,0x0,0x5F,0x0,0x0},
    {0x0,0x7,0x0,0x7,0x0},
    {0x14,0x7F,0x14,0x7F,0x14}, // etc.
Run Code Online (Sandbox Code Playgroud)

该表的前导部分与ASCII表匹配,后跟一组特殊符号,例如箭头或复选标记.要引用那些我有一个宏列表:

#define SYMBOL_LEFT_ARROW 120 // 120 is the entry in the table
#define SYMBOL_RIGHT_ARROW (SYMBOL_LEFT_ARROW+1)    
#define SYMBOL_UP_ARROW (SYMBOL_RIGHT_ARROW+1)
Run Code Online (Sandbox Code Playgroud)

现在我需要说一些(不会编译):

const char * const message = "Next" + SYMBOL_RIGHT_ARROW;
Run Code Online (Sandbox Code Playgroud)

问题:如何将SYMBOL_RIGHT_ARROW"\ x79"或整个字符串转换为"Next\x79" AT COMPILE TIME,以便我可以在R/O部分中输入字符串?

飞思卡尔HC08 C编译器.

c c-preprocessor

6
推荐指数
1
解决办法
7987
查看次数

定义USE(x)(x)=(x)

在其中一个C源代码文件中,我找到了以下行(宏):

#define USE(x) (x) = (x)
Run Code Online (Sandbox Code Playgroud)

它是这样使用的:

int method(Obj *context)
    {
    USE(context);
    return 1;
    }
Run Code Online (Sandbox Code Playgroud)

谷歌搜索后,我发现了以下描述:

//宏来摆脱一些编译器警告

你能告诉我更多关于这个宏的信息吗?

谢谢你的回答!

c c-preprocessor

6
推荐指数
3
解决办法
471
查看次数

在Linux内核源代码中遇到Abstruse #define宏

get_cpu_var marcro,定义如下

 29 #define get_cpu_var(var) (*({                           \
 30         extern int simple_identifier_##var(void);       \
 31         preempt_disable();                              \
 32         &__get_cpu_var(var); }))
Run Code Online (Sandbox Code Playgroud)

似乎是不可理解的.我假设它是一种函数宏,它返回一个变量指针(基于星号)或者它是某种函数指针.我甚至接近它?有人能启发我吗?

c gcc linux-kernel c-preprocessor

6
推荐指数
1
解决办法
628
查看次数

从C语言的printf语句中调用宏函数

我在使用printf()语句中理解宏函数调用的使用时遇到了问题.

我有以下代码:

#include<stdio.h>
#define f(g,h) g##h
main()
{
    printf("%d",f(100,10));
}
Run Code Online (Sandbox Code Playgroud)

此代码输出"10010"作为答案.

我已经知道宏函数调用只是复制粘贴宏函数代码代替调用替换参数.

所以代码应该是这样的:

#include<stdio.h>
#define f(g,h) g##h
main()
{
    printf("%d",100##10);
}
Run Code Online (Sandbox Code Playgroud)

但是当我用替换宏分别执行上面的代码时,我得到一个编译错误.

那么第一个代码如何给出10010作为答案而第二个代码给出了编译错误呢?

c c-preprocessor

6
推荐指数
1
解决办法
1839
查看次数

“gnu-zero-variadic-macro-arguments”可以安全地忽略吗?

考虑以下代码(实例)

#define TEST_VA(mX, ...) TEST
#define STRINGIFY_IMPL(mX) #mX
#define STRINGIFY(mX) STRINGIFY_IMPL(mX)

#include <iostream>

int main()
{
    std::cout << STRINGIFY(TEST_VA(1)) << std::endl;
    std::cout << STRINGIFY(TEST_VA()) << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

clang++ 3.4抱怨:

main.cpp:9:37: warning: must specify at least one argument for '...' parameter of variadic macro [-Wgnu-zero-variadic-macro-arguments]
    std::cout << STRINGIFY(TEST_VA(1)) << std::endl;
                                    ^
main.cpp:1:9: note: macro 'TEST_VA' defined here
#define TEST_VA(mX, ...) TEST
        ^
main.cpp:10:33: warning: must specify at least one argument for '...' parameter of variadic macro …
Run Code Online (Sandbox Code Playgroud)

c++ warnings c-preprocessor variadic-macros c++11

6
推荐指数
1
解决办法
5885
查看次数

绕过#defined'd宏?

假设你有宏

#define TOKEN1 <arbitrary sequence of characters>
Run Code Online (Sandbox Code Playgroud)

但是,假设在某些情况下,你真的是指TOKEN1,而不是它的定义.是否有一个技巧允许预处理文件包含"TOKEN1",没有#unf'ining TOKEN1,并且TOKEN1出现在#define'd之后?

语境:

我正在通过重新定义来添加内存跟踪new.但是,我遇到的问题是我也在operator new几个类中重载了,并且在所有这些地方都必须取消定义新的,然后重新包含执行魔术之后的标题是很尴尬的.

c c++ c-preprocessor

6
推荐指数
1
解决办法
376
查看次数