在我的程序中,我多次阅读整型表单控制台。 每一次,我需要input这一行。 new Scanner(System.in).nextInt(); 我习惯于C / C ++,我想知道是否可以定义类似的东西 #define READINT Scanner(System.in).nextInt(); 然后,在我的Java程序中的每一个地方,我可以读取表格控制台 int a = new READINT; 但是我阅读表单本书不支持macros。 有人请解释我为什么这样,我可以用其他方式来做这件事。
经常教授的标准数组大小的macros是 #define ARRAYSIZE(arr) (sizeof(arr) / sizeof(arr[0])) 或者一些等同的forms。 然而,当一个指针被传入时,这种事情默默地成功了,并且给出了在运行时似乎是合理的结果,直到事情神秘崩溃。 这太容易犯这个错误了:一个具有本地数组variables的函数被重构,将一些数组操作转移到一个新的函数中,并以该数组作为参数调用。 所以,问题是:是否有一个“卫生”的macros来检测C语言中的ARRAYSIZEmacros的滥用,最好在编译时? 在C ++中,我们只使用专门用于数组参数的模板; 在C中,似乎我们需要一些方法来区分数组和指针。 (如果我想拒绝数组,例如,我只是做例如(arr=arr, …)因为数组分配是非法的)。
我经常在我的#defines中使用do-while(0)构造,出于在这个答案中描述的原因。 另外我试图尽可能使用编译器提供的警告级别来捕捉更多的潜在问题,并使我的代码更加健壮和跨平台。 所以我通常使用-Wall与gcc和/Wall与MSVC。 不幸的是MSVC抱怨do-while(0)构造: foo.c(36) : warning C4127: conditional expression is constant 我应该怎么做这个警告? 只需全局禁用所有文件? 对我来说这似乎不是个好主意。
我已经读了很多,LISP可以重新定义语法,大概是用macros。 我很好奇这实际上走了多远? 你能否重新定义语言结构,使其成为另一种语言的编译器? 例如,你能否将LISP的function性改变成面向对象的语法和语义,也许是说语法更接近Ruby这样的语法? 特别是,有可能使用macros摆脱括号的地狱? 我已经学会了足够多的(Emacs-)LISP来自定义Emacs的微特性,但是我非常好奇macros可以在定制语言的时候走多远。
我希望有人能够解释linux内核源码中使用的__usermacros的细微差别。 首先,macros观: # define __user __attribute__((noderef, address_space(1))) 现在,经过一些Googlesearch,我发现这个macros允许指定一个指针属于用户地址空间,而不应该解除引用。 我可能会错过一些明显的事实,但是有人可以解释一下这个macros的含义吗? 举个例子,这个macros在哪里可以被使用,这是一个很好的例子。 再次,原谅我,如果我失去了一些明显的东西。 为了说明这一点,我在考察一些USB代码(linux / usbdevice_fs.h)的同时,把它与macros相关联。 我只是在寻找这个macros(或其他类似的)在内核中使用的一般理解。 感谢您的期待!
我习惯了从Haskell的懒惰评估,并发现自己现在已经使用懒惰评估正确地使用默认的急切语言激怒。 这实际上是非常有害的,因为我使用的其他语言主要是懒散地评估一些非常尴尬的东西,通常涉及到自定义迭代器等等。 所以,仅仅通过获取一些知识,我实际上使自己的原有语言的生产力下降 。 叹。 但是我听说ASTmacros提供了另一种干净的方式来做同样的事情。 我经常听到类似“懒惰的评估使得macros冗余”的说法,反之亦然,主要来自Lisp和Haskell社区的争吵。 我已经涉足了各种Lisp变体的macros。 他们看起来像是一个真正有组织的方式来复制和粘贴大量的代码,以便在编译时处理。 他们当然不是Lispers喜欢认为的圣杯。 但是,这几乎可以肯定是因为我不能正确使用它们。 当然,让macros观系统工作在相同的核心数据结构上,这种语言本身就是非常有用的,但它基本上仍然是复制和粘贴代码的有组织的方式。 我承认,将macros系统放在与允许完整运行时变更的语言相同的AST上是非常有用的。 我想知道的是,macros是如何简明扼要地做懒惰评估呢? 如果我想一行一行地处理一个文件,而不是浑浊起来,我只是返回一个列表,其中有一个线路阅读程序映射到它。 这是DWIM的完美例子(按照我的意思)。 我甚至不必考虑这个问题。 我显然不会得到macros。 我已经使用了它们,并没有特别留下深刻印象的炒作。 所以有些东西我错过了,我没有通过在线阅读文档。 有人可以向我解释这一切吗?
C#能够像使用预处理器语句的C编程语言那样定义macros吗? 我想简化某些重复语句的常规input,如下所示: Console.WriteLine("foo");
为什么在GCC头文件中用括号括起来的常量expression式就像这样? #define INTMAX_MIN (-9223372036854775807LL) #define INTMAX_MAX (9223372036854775807LL) 如果我这样省略括号,会有什么不同? #define INTMAX_MIN -9223372036854775807LL #define INTMAX_MAX 9223372036854775807LL 为什么会有'L'后缀? 如果我写下以下内容,会是一样的吗? #define INTMAX_MIN -9223372036854775807 #define INTMAX_MAX 9223372036854775807 有没有一个实际的用处,或者它总是一样的东西? 我知道'L'代表了很长时间,我也很清楚Cmacros中括号的重要性。 我为了好奇而问这个。
我已经用C ++进行了几年的编程,而且我已经使用了STL,并且创build了自己的模板类几次,以了解它是如何完成的。 现在我正试图将模板更深入地融入到我的面向对象的devise中,一个唠叨的想法一直回到我身上:它们只是一个macros,真的…您可以使用#define实现(而不是UGLY)auto_ptrs,如果你真的想要。 这种关于模板的思考方式可以帮助我理解代码的实际工作方式,但是我觉得我必须以某种方式忽略这一点。 macros指的是邪恶的化身,但“模板元编程”却风靡一时。 那么,真正的区别是什么? 以及模板如何避免#define引导你进入的危险 在你不指望他们的地方出现难以察觉的编译器错误? 代码膨胀? 跟踪代码有困难吗? 设置debugging器断点?
可能重复: 什么是Cmacros有用? 每隔几个月,我都会痒痒地去学习一些C语言,那就是我的垃圾大学编程教育从来没有涉及过。 今天是macros。 我对macros的基本理解是,它们是一个简单的search,并在代码被编译之前replace它。 我无法理解为什么要使用macros。 我正在看的大部分基本例子都是这样的 TEST(a,%d); #define TEST(a,b) printf(" The value of " #a " = " #b " \n", a) //which expands to printf(" The value of a = %d \n",a); (从这里例子) 从我的新手angular度来看,似乎定义一个新的function会给你相同的结果。 我可以看到历史上的macros如何在易于search和replace之前快速修改大量源代码很有用,但是某些事情告诉我我错过了一些更重要的点。 那么macros可以为你做些什么有用的事情呢?