我试图用来#define在我的程序中定义一个常量.我意识到我可以使用const,但我想要很好地理解#define.有人可以解释为什么以下代码不起作用,应该改为吗?
#include <stdio.h>
#define M 20;
typedef int Marray_t[M][M]; //I can't define an M x M array
int main() {
Marray_t A;
int i;
for (i = 0; i < M; ++i) { //Can't iterate up to M
A[i] = i;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud) 为什么#if满足以下代码中的条件:
#include <iostream>
#define VALUE foo
int main() {
#if VALUE == bar
std::cout << "WORKS!" << std::endl;
#endif // VALUE
}
Run Code Online (Sandbox Code Playgroud) 是否有可能创建宏来替换operator new包含额外args的所有形式的重载...说__FILE__和__LINE__?
麻烦似乎operator new可以用括号括或不用括号编码,因此:
类似对象的宏:
#define new new(__FILE__, __LINE__)
Run Code Online (Sandbox Code Playgroud)
将取代声明,如:
A* a = new A();
Run Code Online (Sandbox Code Playgroud)和类似函数的宏:
#define new(A) new (A, __FILE__, __LINE__)
Run Code Online (Sandbox Code Playgroud)
将取代声明,如:
A* a = new(std::nothrow) A();
Run Code Online (Sandbox Code Playgroud)不幸的是,尝试使用相同的标识符声明两个宏是错误的,即使它们的类型不同,因此以下操作失败:
#define new new(__FILE__, __LINE__)
#define new(A) new (A, __FILE__, __LINE__) // Error: "new" already defined
Run Code Online (Sandbox Code Playgroud)
由于我正在使用g ++,我希望使用它们的可变参数宏的语法会产生成功,但遗憾的是没有.下列:
#define new(...) new(__FILE__, __LINE__, ## __VA_ARGS__)
Run Code Online (Sandbox Code Playgroud)
只匹配new(xyx) A(),而不是new A().
在我们的遗留代码中,以及我们的现代代码中,我们使用宏来执行代码生成等的漂亮解决方案.我们同时使用#和##运算符.
我很好奇其他开发人员如何使用宏来做很酷的事情,如果他们根本使用它们的话.
在尝试从显示获取数据的视图控制器中取消模型时,在异步提取完成时,我发布了NSNotification.
[[NSNotificationCenter defaultCenter] postNotificationName:@"foobarFetchSuccess" object: foo];
Run Code Online (Sandbox Code Playgroud)
我养成了使用的习惯:
#define FOO_FETCH_SUCCESS @"foobarFetchSuccess"
Run Code Online (Sandbox Code Playgroud)
在一个公共头文件中,然后将其用于addObserver:和removeObserver:以及postNotificationName:
[[NSNotificationCenter defaultCenter] addObserver:self @selector(gotData)
name:FOO_FETCH_SUCCESS object: baz];
Run Code Online (Sandbox Code Playgroud)
所以@"foobarFetchSuccess"字符串遍布整个地方.还有更多像他一样的人.那么一次声明一个字符串并在任何地方使用它的最佳方法是什么?
我想做这样的事情:
class SomeClass { };
GENERATE_FUNTION(SomeClass)
Run Code Online (Sandbox Code Playgroud)
该GENERATE_FUNCTION宏我想定义的名字是由宏参数确定的函数.在这种情况下,我希望它定义一个函数func_SomeClass.怎么办?
我在构建设置中定义了预处理器宏
FOO=BAR
Run Code Online (Sandbox Code Playgroud)
我希望将这个值按到一个可以传递给方法的Objective-C字符串文字中.以下#define不起作用,但它应该展示我想要实现的目标:
#define FOOLITERAL @"FOO" //want FOOLITERAL to have the value of @"BAR"
myMethodThatTakesAnNSString(FOOLITERAL);
Run Code Online (Sandbox Code Playgroud)
我希望我只是在某种程度上错过了显而易见的东西,但我似乎无法找到合适的预处理器伏都教来获得我需要的东西.
cocoa cocoa-touch objective-c stringification c-preprocessor
可能重复:
C宏以创建字符串
我有一个函数接受一个类型的参数char*,比如f("string");
如果字符串参数是在函数调用中由-the-fly定义的,那么如何在字符串体内扩展宏呢?
例如:
#define COLOR #00ff00
f("abc COLOR");
Run Code Online (Sandbox Code Playgroud)
相当于
f("abc #00ff00");
Run Code Online (Sandbox Code Playgroud)
但相反,不执行扩展,并且函数从字面上接收abc COLOR.
特别是,我需要精确地扩展宏\"#00ff00\",以便这个引用的标记与传递给它的其余字符串参数连接f(),包括引号; 也就是说,预处理器必须完成他的工作并欢迎编译器将代码转换f("abc COLOR");为f("abc \"#00ff00\"");
我知道这是一个常见问题,但我仍然无法完全理解它.
在从多个不同的源文件和头文件生成的C或C++程序中,当使用标题保护时,每个头文件是否只包含在整个代码中一次?
之前有人告诉我,头文件(带有包含警卫)只能在一个翻译单元中包含一次,但在整个代码中会多次包含.这是真的?
如果它在整个代码中只被包含一次,当一个文件希望包含它并且预处理器检测到它已经被包含时,那个希望使用它的文件如何知道它之前包含的代码中的位置?
我正在看一个定义了大量常量数组的应用程序.让我感到困惑的是在宏观中使用彼此相邻的两个磅标志.例如:
#define r0(p,q,r,s) 0x##p##q##r##s
Run Code Online (Sandbox Code Playgroud)
那两个磅标志是什么意思?
c-preprocessor ×10
c ×5
c++ ×5
objective-c ×2
c-strings ×1
cocoa ×1
cocoa-touch ×1
gcc ×1
header-files ×1
macros ×1