我有这段代码(实际上是垃圾收集的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中是否有办法使用宏从字符文字创建字符串文字?
比如我有
'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
斯科特迈耶斯对零规则有一个很好的观点.基本上他主张默认移动/复制分配/构造你是否真的需要它们.基本上一般的经验法则是避免编译器生成这些成员,主要是因为它们是混淆的一个重要来源(我同意这一点).
因此,我正在考虑如何将类定义为默认的可移动,可复制或不可移动,不可复制的良好通用实践.我想到了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/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 <>"输出真的很难看,我只想要几个简单的宏扩展而没有所有的开销.
我有一个表格,用于在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源代码文件中,我找到了以下行(宏):
#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)
谷歌搜索后,我发现了以下描述:
//宏来摆脱一些编译器警告
你能告诉我更多关于这个宏的信息吗?
谢谢你的回答!
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)
似乎是不可理解的.我假设它是一种函数宏,它返回一个变量指针(基于星号)或者它是某种函数指针.我甚至接近它?有人能启发我吗?
我在使用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作为答案而第二个代码给出了编译错误呢?
考虑以下代码(实例):
#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) 假设你有宏
#define TOKEN1 <arbitrary sequence of characters>
Run Code Online (Sandbox Code Playgroud)
但是,假设在某些情况下,你真的是指TOKEN1,而不是它的定义.是否有一个技巧允许预处理文件包含"TOKEN1",没有#unf'ining TOKEN1,并且TOKEN1出现在#define'd之后?
语境:
我正在通过重新定义来添加内存跟踪new.但是,我遇到的问题是我也在operator new几个类中重载了,并且在所有这些地方都必须取消定义新的,然后重新包含执行魔术之后的标题是很尴尬的.
c-preprocessor ×10
c ×7
c++ ×4
c++11 ×2
boost ×1
gcc ×1
linux-kernel ×1
substitution ×1
warnings ×1