【发布时间】:2013-02-11 04:44:50
【问题描述】:
我正在尝试更改常量变量的值,是的,我知道我正在做的事情的矛盾,但是我的疯狂有一种方法。
你看我正在用一种非常类似于 C/C++ 的语言编写,称为 4dm,但它不允许函数之外的任何代码,所以我试图通过使用预处理器命令来克服这个问题.原因是我可以在语言中实现某种形式的专业化。第一步涉及能够编辑常量字符串。
尽管这是一种不同的语言,但预处理器的运行方式与 C 和 C++ 编译器完全相同:
#define MY_STR "abc"
#define CONCAT(s) \
#define TEMP MY_STR \ // store MY_STR in TEMP_STR
#undef MY_STR \ // undefine MY_STR
#define MY_STR TEMP s // redefine MY_STR so it contains the old value plus the new one
CONCAT(def)
printf("%s\n", MY_STR); // should hopefully print out "abc def"
以下是连接字符串的简单尝试,但我收到一个编译错误,提示 MY_STR is not defined 任何想法如何解决这个问题?
#define MY_STR abc
#define TEMP MY_STR
#undef MY_STR
#define MY_STR TEMP def
void test()
{
print(MY_STR);
}
【问题讨论】:
-
修改常量字符串会导致 C++ 中的未定义行为,但您在这里所做的是重新定义预处理器宏,而不是修改
const string。这是完全不同的两件事。你还有什么问题? -
你正走向失望!提供有关您要达到的目标的更多信息。可能还有其他方法可以实现。
-
@paddy 我会解释它,但它会占用大量文本并将问题从连接/重新定义常量到递归和规范的切线中解开,所以我会提出一个新问题
-
顺便说一句,C 预处理器不是这样工作的,而且从来没有。您不能将指令放在宏中。
-
@JakeM 您正面临 XY 问题。你有问题 X,你认为你可以用 Y 解决它,所以你问 Y。但 Y 可能不是解决方案。我们需要对您真正想要实现的目标进行高级描述,因此我们可以告诉您预处理器是否可以做到这一点。 (如果您确实拥有符合 C 或 C++ 标准的预处理器。)
标签: c-preprocessor preprocessor-directive