在C中的位置MIN
和MAX
定义,如果有的话?
实现这些的最佳方式是什么,尽可能通用和安全?(首选编译器扩展/内置主流编译器.)
我想在C中编写一个宏,它接受任意数量的参数,而不是特定的数字
例:
#define macro( X ) something_complicated( whatever( X ) )
Run Code Online (Sandbox Code Playgroud)
哪里X
有任何数量的参数
我需要这个,因为它whatever
是重载的,可以用2或4个参数调用.
我试过两次定义宏,但第二个定义覆盖了第一个!
我正在使用的编译器是g ++(更具体地说,mingw)
这就是我想要做的:
switch(myvar)
{
case: 2 or 5:
...
break;
case: 7 or 12:
...
break;
...
}
Run Code Online (Sandbox Code Playgroud)
我尝试了"case:2 || 5",但它没有用.
目的是不为不同的值编写相同的代码.
考虑以下两个带括号的片段:
switch (var) {
case FOO: {
x = x + 1;
break;
}
case BAR: {
y = y + 1;
break;
}
}
Run Code Online (Sandbox Code Playgroud)
没有括号:
switch (var) {
case FOO:
x = x + 1;
break;
case BAR:
y = y + 1;
break;
}
Run Code Online (Sandbox Code Playgroud)
我知道,在带括号的代码段中,通过将每个案例括在大括号中来创建一个新的范围.但是,如果每个案例都不需要新范围(即没有重用变量名称),那么在案例中使用大括号是否存在任何性能损失?
我试图弄清楚如何编写一个宏,将一个变量名称的字符串文字表示与变量本身一起传递给一个函数.
例如,给出以下功能.
void do_something(string name, int val)
{
cout << name << ": " << val << endl;
}
Run Code Online (Sandbox Code Playgroud)
我想写一个宏,所以我可以这样做:
int my_val = 5;
CALL_DO_SOMETHING(my_val);
Run Code Online (Sandbox Code Playgroud)
哪个会打印出来: my_val: 5
我尝试过以下操作:
#define CALL_DO_SOMETHING(VAR) do_something("VAR", VAR);
Run Code Online (Sandbox Code Playgroud)
但是,正如您可能猜到的那样,引号内的VAR不会被替换,而只是作为字符串文字"VAR"传递.所以我想知道是否有办法让宏参数变成字符串文字本身.
我想写这样的东西:
#define COV_ON(x) \
#ifdef COVERAGE_TOOL \
_Pragma (COVERAGE #x)
#endif
Run Code Online (Sandbox Code Playgroud)
有没有办法COV_ON
像这样定义?我知道我上面做的是错误的,因为我不能#ifdef
在#define里面.(#
不是允许的角色#define
).那么有什么解决方案吗?
我想知道是否有可能迭代传递给C99中的可变参数宏或使用任何GCC扩展的参数?
例如,是否可以编写一个通用的宏,它接受一个结构,并将其字段作为参数传递,并打印结构中每个字段的偏移量?
像这样的东西:
struct a { int a; int b; int c; }; /* PRN_STRUCT_OFFSETS will print offset of each of the fields within structure passed as the first argument. */ int main(int argc, char *argv[]) { PRN_STRUCT_OFFSETS(struct a, a, b, c); return 0; }
这个问题主要针对C/C++,但我猜其他语言也是相关的.
我无法理解为什么仍然使用switch/case而不是if/else if.在我看来,很像使用goto,并导致相同类型的混乱代码,而相同的结果可以使用if/else,如果是更有条理的方式.
不过,我经常看到这些块.找到它们的一个常见位置是在消息循环(WndProc ...)附近,而这些是它们引发最严重破坏的地方之一:变量在整个块中共享,即使不是主要的(也不是在里面初始化).必须特别注意不要放弃休息,等等......
就个人而言,我避免使用它们,我想知道我错过了什么?
它们比if/else更有效吗?它们是否继承传统?
我刚刚在C中遇到了一个我非常喜欢的DEBUG宏
#ifdef DEBUG_BUILD
# define DEBUG(x) fprintf(stderr, x)
#else
# define DEBUG(x) do {} while (0)
#endif
Run Code Online (Sandbox Code Playgroud)
我猜一个C++模拟会是: -
#ifdef DEBUG_BUILD
# define DEBUG(x) cerr << x
#else
# define DEBUG(x) do {} while (0)
#endif
Run Code Online (Sandbox Code Playgroud)
编辑:通过"调试宏"我的意思是"在调试模式下运行程序时可能派上用场的宏".
我知道我正试图在腿上射击自己;)然而,它将允许我使其余(大量)代码更小,更易读.
是否有任何棘手的方法在另一个预处理器宏内部创建预处理器宏?
这是一个例子,我在寻找什么.我的真实场景更复杂
// That's what I want to do and surely C++ doesn't like it.
#define MACROCREATER(B) #define MACRO##B B+B
void foo()
{
MACROCREATOR(5) // This should create new macro (#define MACRO5 5+5)
int a = MACRO5; // this will use new macro
}
Run Code Online (Sandbox Code Playgroud)