相关疑难解决方法(0)

您遇到过的最糟糕的真实世界宏/预处理器滥用情况是什么?

您遇到的最糟糕的 现实世界宏/预处理器滥用是什么(请不要设想IOCCC答案*哈哈*)?

如果它真的很有趣,请添加一个简短的片段或故事.目标是教一些东西,而不是总是告诉人们"永远不要使用宏".


ps:之前我曾经使用过宏...但是当我有一个"真正的"解决方案时,我最终会摆脱它们(即使真正的解决方案是内联的,它也会变得类似于宏).


额外:举一个例子,宏实际上比非宏解决方案更好.

相关问题: C++宏什么时候有用?

c c++ macros preprocessor

176
推荐指数
36
解决办法
11万
查看次数

在C中使用枚举类型的变量作为字符串的简单方法?

这是我想要做的:

typedef enum { ONE, TWO, THREE } Numbers;
Run Code Online (Sandbox Code Playgroud)

我正在尝试编写一个函数来执行类似于以下的切换案例:

char num_str[10];
int process_numbers_str(Numbers num) {
  switch(num) {
    case ONE:
    case TWO:
    case THREE:
    {
      strcpy(num_str, num); //some way to get the symbolic constant name in here?
    } break;
    default:
      return 0; //no match
  return 1;
}
Run Code Online (Sandbox Code Playgroud)

而不是在每种情况下定义,有没有办法使用枚举变量设置它,就像我在上面尝试做的那样?

c enums c-preprocessor

86
推荐指数
8
解决办法
9万
查看次数

为什么C#中没有宏?

在第一次学习C#时,我很惊讶他们不支持与C/C++相同容量的宏.我意识到#define关键字存在于C#中,但与我在C/C++中的喜爱相比,它非常缺乏.有谁知道为什么C#中缺少真正的宏?

如果这个问题已经以某种形式提出,我很抱歉 - 我保证在发布前花了5分钟时间寻找重复的问题.

.net c# macros c-preprocessor

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

在C++中#define的适当使用场景是什么?

我知道基本的规则,使用inline,enumconst不是#define,这不是我追求这个问题.我想知道的是#define在C++中使用宏以及如何使用宏的可接受场景.

请不要发布问题或链接到"define vs const"问题或"预处理器与编译器",我已经通过了Scott Meyers的Effective C++,我知道一个优于另一个的优点.

然而,经过几个小时的网上冲浪,我觉得#define被认为是C++中的某种弱者,但我确信必须有一个案例,使用它可以接受甚至是可取的.

为了推动这个问题,我猜想我可以想到的一个场景是创建一个DEBUG基于它的宏,它可以打印所有代码以及用于调试目的的所有内容.

c++ macros c-preprocessor

18
推荐指数
5
解决办法
1056
查看次数

C++构造替换C构造

在与我的团队中新来的开发人员讨论之后,我意识到在C++中仍然存在使用C构造的习惯,因为它们应该更好(即更快,更精简,更漂亮,选择你的理由).

与类似的C++构造相比,有哪些示例值得共享,显示C构造?

对于每个示例,我需要阅读C++构造与原始C构造一样好或甚至更好的原因.目的是提供一些在C++代码中被认为有些危险/不安全的C构造的替代方案(C++ 0x只有在只有明确标记为C++ 0x的情况下才能接受答案).

我将在答案(结构内联初始化)下面作为示例发布.

注1:请每个案例一个答案.如果您有多个案例,请发布多个答案

注2:这不是C问题.不要在此问题中添加"C"标签. 这不应该成为C++和C之间的斗争.只研究C++的C子集的一些结构,以及它们在其他C++"工具包"中的替代方案.

注3:这不是一个抨击C的问题.我想要理由.吹嘘,抨击和未经证实的比较将被下调.提及没有C等价物的C++特性可以被认为是不可能的主题:我希望并排放置一个针对C++特性的C特征.

c c++ language-construct

17
推荐指数
9
解决办法
3177
查看次数

C++ 0X概念已经消失.还应该使用哪些其他功能?

您可能已经听说过,C++标准委员会的最后一次会议投票决定从下一个C++标准中删除概念.当然,这会影响其他功能,并且似乎再次打开标准.如果是这种情况,您认为哪些其他功能应该被删除(或添加),为什么?

链接:

删除概念 - Danny Kalev(关于删除概念的决定)

简化概念的使用 - Bjarne Stroustrup(关于现在看来的概念问题)

长杆变得更长 - 马丁Tasker(如果必须修复概念,对C++ 0x的时间表的影响)

关于Dobbs博士问题的C++ 0x"删除概念"决定 - Stroustrup

旅行报告:退出概念,约18个月的最终ISO C++草案 - Herb Sutter

概念获得投票C++ 0x岛 - Jeremy Siek捍卫当前的概念规范

法兰克福发生了什么? - Doug Gregor关于C++ Next(关于概念的历史和删除).

c++ c++11 c++-concepts

17
推荐指数
4
解决办法
2910
查看次数

制作C标识符和字符串?

假设您要生成标识符和字符串的匹配列表

enum
{
NAME_ONE,
NAME_TWO,
NAME_THREE
};

myFunction(NAME_ONE, "NAME_ONE");
myFunction(NAME_TWO, "NAME_TWO");
myFunction(NAME_THREE, "NAME_THREE");
Run Code Online (Sandbox Code Playgroud)

..没有重复自己,没有自动生成代码,使用C/C++宏

初步猜测:

您可以添加包含的#include文件

myDefine(NAME_ONE)
myDefine(NAME_TWO)
myDefine(NAME_THREE)
Run Code Online (Sandbox Code Playgroud)

然后使用它两次,如:

#define myDefine(a) a,
enum {
#include "definitions"
}
#undef myDefine

#define myDefine(a) myFunc(a, "a");
#include "definitions"
#undef myDefine
Run Code Online (Sandbox Code Playgroud)

但#define不允许你在字符串中放置参数?

c c-preprocessor preprocessor-directive

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

在switch语句中使用字符串 - 我们在C++ 17中的立场是什么?

我们每个人(可能)都有童年的写作梦想:

switch(my_std_string) {
case "foo":  do_stuff(); break;
case "bar":  do_other_stuff(); break;
default:     just_give_up();
}
Run Code Online (Sandbox Code Playgroud)

但这是不可能的,正如古代(2009年)对这个问题的答案所解释的那样:

为什么switch语句不能应用于字符串?

从那时起,我们已经看到了C++ 11的出现,它让我们走得更远:

switch (my_hash::hash(my_std_string)) {
case "foo"_hash:  do_stuff(); break;
case "bar"_hash:  do_other_stuff(); break;
default:          just_give_up();
}
Run Code Online (Sandbox Code Playgroud)

如在描述答案编译时间字符串哈希 -这是没有那么糟糕,但它实际上并没有做正是我们想要的-有碰撞的机会.

我的问题是:从那时起语言的发展(我认为主要是C++ 14)是否影响了编写一个字符串case语句的方式?或简化实现上述目的的螺母和螺栓?

具体而言,与结束C++ 17标准之中指日可待 -我很感兴趣,鉴于我们可以假设标准将包含答案.

注意:这不是关于使用switch语句的优点的讨论,也不是关于meta的线程的讨论.我问的是一个内容丰富的问题​​,所以请在此基础上回答/ up/downvote.

c++ stdstring string-literals switch-statement c++17

13
推荐指数
2
解决办法
6412
查看次数

这是宏观滥用吗?

我正在对一些代码进行逆向工程并遇到了这个......

/************************************************************************/
/*                                                                      */
/*                          MACRO CHECK_FREAD                           */
/*                                                                      */
/*  CHECK_FREAD is used to check the status of a file read.  It         */
/*   is passed the return code from read and a string to print out if   */
/*   an error is detected.  If an error is found, an error message is   */
/*   printed out and the program terminates.  This was made into a      */
/*   macro because it had to be done over and over and …
Run Code Online (Sandbox Code Playgroud)

c macros file-io coding-style

12
推荐指数
3
解决办法
1753
查看次数

何时以及为何使用#define宏(x)代替函数?

看到这个问题让我想知道为什么这个方法(玩具示例):

#define foo(x) bar[x] = 0
Run Code Online (Sandbox Code Playgroud)

永远比这个功能更受欢迎:

void foo(unsigned x){ bar[x] = 0; }
Run Code Online (Sandbox Code Playgroud)

在上面提到的问题之前,我之前只看过一次,在PolarSSL库中,我认为它是某种优化,并试图不要过多考虑它.

我假设使用预处理器宏将'call'替换为它所存在的'(not-)函数体'; 然而,void编译器可能会或可能不会优化该函数,因此可能导致大量分支用于小型和简单的操作或两次.

还有其他好处吗?

何时首选宏方法,何时更好地信任编译器?

c c++ macros

12
推荐指数
2
解决办法
3789
查看次数