小编a3f*_*a3f的帖子

有没有办法用Visual C++中的可变参数列表编写宏?

据我所知,在gcc中你可以写下这样的东西:

#define DBGPRINT(fmt...) printf(fmt);
Run Code Online (Sandbox Code Playgroud)

有没有办法在VC++中做到这一点?

c++ visual-c++ c-preprocessor variadic-macros

16
推荐指数
1
解决办法
2万
查看次数

C预处理器#和##运算符

C99标准文档具有相关的##预处理运算的部分下面的例子:

在以下片段中:

#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"
Run Code Online (Sandbox Code Playgroud)

换句话说,扩展hash_hash会产生一个新的令牌,由两个相邻的尖锐符号组成,但这个新令牌不是##运算符.

我不明白为什么hash_hash的替换产生##而不是"##"或"#""#".在双哈希播放之前和之后单个哈希有什么作用?

任何回复都非常感谢.

c concatenation c-preprocessor

16
推荐指数
1
解决办法
9910
查看次数

在switch语句中第一个'case'之前的代码

在C中,可以在第一个case标签之前编写代码.有没有这样做的情况,或者它只是一个"死代码块"?

例如:

switch (...)    {
  {
    int a = 0x2a;
    printf("%d\n", a);
  }
  case 0:
    ...
}
Run Code Online (Sandbox Code Playgroud)

c switch-statement

15
推荐指数
3
解决办法
3008
查看次数

"#define STR(a)#a"有什么作用?

我正在阅读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找到它.

c c++ c-preprocessor

15
推荐指数
2
解决办法
5350
查看次数

ARRAYSIZE C++宏:它是如何工作的?

OK,我不完全是一个新手,但我不能说我理解下面的宏.最令人困惑的部分是将值转换为size_t:这实际上是什么?特别是,因为我看到一个否定运算符,据我所知,它可能导致零值.这是不是意味着它会导致被零除错误?(顺便说一句,宏正确的,并且工作得很漂亮.)

#define ARRAYSIZE(a) \
  ((sizeof(a) / sizeof(*(a))) / \
  static_cast<size_t>(!(sizeof(a) % sizeof(*(a)))))
Run Code Online (Sandbox Code Playgroud)

c++ c-preprocessor

15
推荐指数
3
解决办法
3万
查看次数

预处理程序令牌扩展

我对预处理器如何工作的心理模型显然是不完整的,这让我发疯.

我想连接两个标记,但第二个标记应该首先扩展.

#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 c++ c-preprocessor

15
推荐指数
1
解决办法
7750
查看次数

如何检查单个#ifdef中是否定义了多个宏之一?

我有一些C++代码,并且如果定义了__APPLE____linux宏,则想要执行操作.

如果我把它作为一个正常的if条件,它将很容易使用||:

if (something || something) { .. code .. }
Run Code Online (Sandbox Code Playgroud)

但据我所知,没有||运营商的#ifdef陈述.我将如何检查__APPLE____linux使用一个单一的定义#ifdef语句?

c++ conditional-compilation c-preprocessor

15
推荐指数
1
解决办法
2万
查看次数

我需要#undef本地#define吗?是否存在本地定义?

有时为了使事情更易于编写和读取,我在函数中编写了一些本地#define(for example, #define O_REAL Ogre::Real).

我是否需要#undef本地#define以确保它保持在某个代码块内?或者当它超出范围时自动#undef?它甚至有范围的概念吗?

我不确定#define在这种情况下是如何工作的.现在,我当然已经尝试了代码并得出了一些结论,但由于我不确定,我想要一些专家意见/建议.

c++ c-preprocessor

14
推荐指数
1
解决办法
1万
查看次数

将数组文字作为宏参数传递

这已经困扰了我一段时间,例如,如果我正在尝试编写这段代码:

// 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,{12,和3}.有没有办法将数组文字传递给宏?

编辑:在一些较复杂的宏,我需要的,我可能还需要两个或更多的数组传递给宏,所以可变参数宏不起作用.

c c-preprocessor

14
推荐指数
1
解决办法
8568
查看次数

来自C++宏中的相互引用的奇怪结果

考虑以下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如何工作?

c++ c-preprocessor

14
推荐指数
2
解决办法
465
查看次数