C风格的宏名称是否与标识符具有相同的命名规则?在编译器升级之后,它现在为遗留应用程序发出此警告:
warning #3649-D: white space is required between the macro name "CHAR_" and its replacement text
#define CHAR_& 38
Run Code Online (Sandbox Code Playgroud)
这行代码定义了&符号的ASCII值常量.
#define DOL_SN 36
#define PERCENT 37
#define CHAR_& 38
#define RT_SING 39
#define LF_PAR 40
Run Code Online (Sandbox Code Playgroud)
我假设这个定义(实际上没有被任何代码引用,据我所知)是错误的,应该改为像"CHAR_AMPERSAND"这样的东西?
我有兴趣使用C预处理器以外的东西来预处理我的C和Objective-C源代码.有好的选择吗?
一个例子是允许一个人逃脱到C代码中间的python或perl片段,并且片段吐出C然后编译为正常.
是否可以制作自定义操作符,以便您可以执行此类操作?
if ("Hello, world!" contains "Hello") ...
Run Code Online (Sandbox Code Playgroud)
注意:这是一个单独的问题:"这是一个好主意......";)
我在我的代码中使用了JUCE库和一些Boost头文件.Juce将"T"定义为宏(呻吟),Boost经常在其模板定义中使用"T".结果是,如果你以某种方式在Boost头之前包含JUCE头,那么预处理器会扩展Boost代码中的JUCE宏,然后编译器就会无可救药地丢失.
在大多数情况下保持我的包含顺序并不难,但是当你有一个包含一些其他类的JUCE类时,它会变得棘手,在链上的某个地方,一个文件包含Boost,如果有任何文件在它之前需要JUCE包括你遇到麻烦.
我最初的希望是解决这个问题
#undef T
Run Code Online (Sandbox Code Playgroud)
之前任何包括Boost.但问题是,如果我不重新定义它,那么其他代码会混淆"T"未被声明.
然后我想也许我可以这样做一些循环的#define技巧:
// some includes up here
#define ___T___ T
#undef T
// include boost headers here
#define T ___T___
#undef ___T___
Run Code Online (Sandbox Code Playgroud)
丑陋,但我认为它可能有用.
可悲的是没有.我在使用"T"作为宏的地方出错
'___T___' was not declared in this scope.
Run Code Online (Sandbox Code Playgroud)
有没有办法让这两个库可靠地一起工作?
宏很好.模板很好.几乎无论它的工作原理都很好.
这个例子是OpenGL; 但该技术是C++特有的,并且不依赖于OpenGL的知识.
精确问题:
我想要一个表达式E; 我不需要指定唯一名称; 这样,在定义E的地方调用构造函数,并在块E的末尾调用析构函数.
例如,考虑:
class GlTranslate {
GLTranslate(float x, float y, float z); {
glPushMatrix();
glTranslatef(x, y, z);
}
~GlTranslate() { glPopMatrix(); }
};
Run Code Online (Sandbox Code Playgroud)
手动解决方案
{
GlTranslate foo(1.0, 0.0, 0.0); // I had to give it a name
.....
} // auto popmatrix
Run Code Online (Sandbox Code Playgroud)
现在,我不仅有glTranslate,还有很多其他的PushAttrib/PopAttrib调用.我宁愿不必为每个var提出一个唯一的名称.是否存在涉及宏模板的一些技巧......或者其他会自动创建变量的变量,在定义点调用构造函数; 和块结束时调用的析构函数?
谢谢!
你能用C中的宏做这样的事吗?
#define SUPERMACRO(X,Y) #define X Y
then
SUPERMACRO(A,B) expands to #define A B
Run Code Online (Sandbox Code Playgroud)
我有一种感觉不是因为预处理器只进行了一次.
官方gcc唯一.请不要使用第三方工具.
我写了一个可变参数模板,它接受可变数量的char参数,即
template <char... Chars>
struct Foo;
Run Code Online (Sandbox Code Playgroud)
我只是想知道是否有任何宏技巧允许我使用类似于以下语法实例化它:
Foo<"abc">
Run Code Online (Sandbox Code Playgroud)
要么
Foo<SOME_MACRO("abc")>
Run Code Online (Sandbox Code Playgroud)
要么
Foo<SOME_MACRO(abc)>
Run Code Online (Sandbox Code Playgroud)
等等
基本上,任何阻止你单独写字符的东西,就像这样
Foo<'a', 'b', 'c'>
Run Code Online (Sandbox Code Playgroud)
这对我来说不是一个大问题,因为它只是一个玩具程序,但我想我还是会问.
为了在C++中正确调试复杂的宏,我通常在它们上运行预处理器,以便准确地查看生成的代码的样子.
是否有类似的方法来"预处理"模板代码?
可能重复:
为什么有人会使用#define来定义常量?
c ++ C++中的宏和const之间的区别
- 枚举与const对#define
使用#define和const创建常量有什么区别?有没有比其他的性能优势?当然我更喜欢使用它,const但我会考虑#define它是否具有合适的优势.
我有一个主目录,A有两个子目录B和C.
目录B包含头文件structures.c:
#ifndef __STRUCTURES_H
#define __STRUCTURES_H
typedef struct __stud_ent__
{
char name[20];
int roll_num;
}stud;
#endif
Run Code Online (Sandbox Code Playgroud)
目录C包含main.c代码:
#include<stdio.h>
#include<stdlib.h>
#include <structures.h>
int main()
{
stud *value;
value = malloc(sizeof(stud));
free (value);
printf("working \n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是我收到一个错误:
main.c:3:24: error: structures.h: No such file or directory
main.c: In function ‘main’:
main.c:6: error: ‘stud’ undeclared (first use in this function)
main.c:6: error: (Each undeclared identifier is reported only …Run Code Online (Sandbox Code Playgroud)