据我所知,在gcc中你可以写下这样的东西:
#define DBGPRINT(fmt...) printf(fmt);
Run Code Online (Sandbox Code Playgroud)
有没有办法在VC++中做到这一点?
的C99标准文档具有相关的##预处理运算的部分下面的例子:
在以下片段中:
Run Code Online (Sandbox Code Playgroud)#define hash_hash # ## # #define mkstr(a) # a #define in_between(a) mkstr(a) #define join(c, d) in_between(c hash_hash d) char p[] = join(x, y); // equivalent to // char p[] = "x ## y";扩张在不同阶段产生:
Run Code Online (Sandbox Code Playgroud)join(x, y) in_between(x hash_hash y) in_between(x ## y) mkstr(x ## y) "x ## y"换句话说,扩展hash_hash会产生一个新的令牌,由两个相邻的尖锐符号组成,但这个新令牌不是##运算符.
我不明白为什么hash_hash的替换产生##而不是"##"或"#""#".在双哈希播放之前和之后单个哈希有什么作用?
任何回复都非常感谢.
在C中,可以在第一个case标签之前编写代码.有没有这样做的情况,或者它只是一个"死代码块"?
例如:
switch (...) {
{
int a = 0x2a;
printf("%d\n", a);
}
case 0:
...
}
Run Code Online (Sandbox Code Playgroud) 我正在阅读phoneME的源代码.这是一个FOSS JavaME实现.它是用C++编写的,我偶然发现了这个:
// Makes a string of the argument (which is not macro-expanded)
#define STR(a) #a
Run Code Online (Sandbox Code Playgroud)
我知道C和C++,但我从来没有读过这样的东西.什么是#在#a做什么?
此外,在同一个文件中,有:
// Makes a string of the macro expansion of a
#define XSTR(a) STR(a)
Run Code Online (Sandbox Code Playgroud)
我的意思是,如果它只是调用一个现有的宏,那么定义一个新宏的用途是什么?
源代码位于https://phoneme.dev.java.net/source/browse/phoneme/releases/phoneme_feature-mr2-rel-b23/cldc/src/vm/share/utilities/GlobalDefinitions.hpp?rev=5525&view =标记.您可以使用CTRL + F找到它.
OK,我不完全是一个新手,但我不能说我理解下面的宏.最令人困惑的部分是将值转换为size_t:这实际上是什么?特别是,因为我看到一个否定运算符,据我所知,它可能导致零值.这是不是意味着它会导致被零除错误?(顺便说一句,宏是正确的,并且工作得很漂亮.)
#define ARRAYSIZE(a) \
((sizeof(a) / sizeof(*(a))) / \
static_cast<size_t>(!(sizeof(a) % sizeof(*(a)))))
Run Code Online (Sandbox Code Playgroud) 我对预处理器如何工作的心理模型显然是不完整的,这让我发疯.
我想连接两个标记,但第二个标记应该首先扩展.
#define ANSWER 42
#define FOO foo_ ## ANSWER
Run Code Online (Sandbox Code Playgroud)
在这里,FOO扩展到foo_ANSWER,但我希望它foo_42.所以我定义了一个MERGE宏,希望在连接之前以某种方式扩展参数:
#define MERGE(x, y) x ## y
#define BAR MERGE(bar_, ANSWER)
Run Code Online (Sandbox Code Playgroud)
但BAR仍然扩大到bar_ANSWER而不是bar_42.所以我定义了另一个宏HELPER:
#define HELPER(x, y) MERGE(x, y)
#define BAZ HELPER(baz_, ANSWER)
Run Code Online (Sandbox Code Playgroud)
现在BAZ已成功扩展到baz_42.目前,这对我来说似乎很神奇.
任何人都可以向我解释这种行为吗?扩展规则如何正常工作?
我有一些C++代码,并且如果定义了__APPLE__或__linux宏,则想要执行操作.
如果我把它作为一个正常的if条件,它将很容易使用||:
if (something || something) { .. code .. }
Run Code Online (Sandbox Code Playgroud)
但据我所知,没有||运营商的#ifdef陈述.我将如何检查__APPLE__或__linux使用一个单一的定义#ifdef语句?
有时为了使事情更易于编写和读取,我在函数中编写了一些本地#define宏(for example, #define O_REAL Ogre::Real).
我是否需要#undef本地#define以确保它保持在某个代码块内?或者当它超出范围时自动#undef?它甚至有范围的概念吗?
我不确定#define在这种情况下是如何工作的.现在,我当然已经尝试了代码并得出了一些结论,但由于我不确定,我想要一些专家意见/建议.
这已经困扰了我一段时间,例如,如果我正在尝试编写这段代码:
// find the length of an array
#define ARRAY_LENGTH(arr) (sizeof(arr)/sizeof(int))
// declare an array together with a variable containing the array's length
#define ARRAY(name, arr) int name[] = arr; size_t name##_length = ARRAY_LENGTH(name);
int main() {
ARRAY(myarr, {1, 2, 3});
}
Run Code Online (Sandbox Code Playgroud)
代码给出了这个错误:
<stdin>:8:31: error: macro "ARRAY" passed 4 arguments, but takes just 2
Run Code Online (Sandbox Code Playgroud)
因为它看作ARRAY(myarr, {1, 2, 3});传递ARRAY参数myarr,{1和2,和3}.有没有办法将数组文字传递给宏?
编辑:在一些较复杂的宏,我需要的,我可能还需要两个或更多的数组传递给宏,所以可变参数宏不起作用.
考虑以下C++代码:
#include <bits/stdc++.h>
using namespace std;
string TRUE = "true";
string FALSE = "false";
#define TRUE FALSE
#define FALSE TRUE
int main()
{
cout << TRUE << endl;
cout << FALSE << endl;
}
Run Code Online (Sandbox Code Playgroud)
使用GCC 4.9.2编译,上面的代码输出:
true
false
Run Code Online (Sandbox Code Playgroud)
产量背后的逻辑是什么?我期望"false \ntrue \n"甚至"false \nfalse \n",但我找不到这个实际输出背后的原因.
在这种情况下,这对#defines如何工作?