标签: c-preprocessor

在C程序中使用#define

我试图用来#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)

c c-preprocessor

27
推荐指数
1
解决办法
7万
查看次数

if-指令宏比较

为什么#if满足以下代码中的条件:

#include <iostream>
#define VALUE foo    

int main() {    
#if VALUE == bar
    std::cout << "WORKS!" << std::endl;
#endif // VALUE
}
Run Code Online (Sandbox Code Playgroud)

c++ c-preprocessor

27
推荐指数
3
解决办法
808
查看次数

宏替换C++运算符new

是否有可能创建宏来替换operator new包含额外args的所有形式的重载...说__FILE____LINE__

麻烦似乎operator new可以用括号括或不用括号编码,因此:

不幸的是,尝试使用相同的标识符声明两个宏是错误的,即使它们的类型不同,因此以下操作失败:

#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().

我知道有些文章是关于为什么不可能写的 …

c++ gcc c-preprocessor

26
推荐指数
3
解决办法
2万
查看次数

我可以使用宏的一些技巧?

在我们的遗留代码中,以及我们的现代代码中,我们使用宏来执行代码生成等的漂亮解决方案.我们同时使用###运算符.

我很好奇其他开发人员如何使用宏来做很酷的事情,如果他们根本使用它们的话.

c c++ stringification c-preprocessor

26
推荐指数
13
解决办法
1万
查看次数

NSNotifications是最佳实践

在尝试从显示获取数据的视图控制器中取消模型时,在异步提取完成时,我发布了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"字符串遍布整个地方.还有更多像他一样的人.那么一次声明一个字符串并在任何地方使用它的最佳方法是什么?

objective-c nsnotification c-preprocessor

26
推荐指数
1
解决办法
9343
查看次数

宏参数的变量名

我想做这样的事情:

class SomeClass { };

GENERATE_FUNTION(SomeClass)
Run Code Online (Sandbox Code Playgroud)

GENERATE_FUNCTION宏我想定义的名字是由宏参数确定的函数.在这种情况下,我希望它定义一个函数func_SomeClass.怎么办?

c++ c-preprocessor

26
推荐指数
2
解决办法
3万
查看次数

预处理器宏值到Objective-C字符串文字

我在构建设置中定义了预处理器宏

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

26
推荐指数
2
解决办法
1万
查看次数

展开引用字符串中的宏

可能重复:
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 macros c-strings c-preprocessor

26
推荐指数
1
解决办法
3万
查看次数

头文件只包含在整个程序中一次?

我知道这是一个常见问题,但我仍然无法完全理解它.

在从多个不同的源文件和头文件生成的C或C++程序中,当使用标题保护时,每个头文件是否只包含在整个代码中一次?

之前有人告诉我,头文件(带有包含警卫)只能在一个翻译单元中包含一次,但在整个代码中会多次包含.这是真的?

如果它在整个代码中只被包含一次,当一个文件希望包含它并且预处理器检测到它已经被包含时,那个希望使用它的文件如何知道它之前包含的代码中的位置?

c c++ header-files c-preprocessor

26
推荐指数
4
解决办法
9007
查看次数

在C宏中,两个相邻的磅符号意味着什么?

我正在看一个定义了大量常量数组的应用程序.让我感到困惑的是在宏观中使用彼此相邻的两个磅标志.例如:

#define r0(p,q,r,s) 0x##p##q##r##s
Run Code Online (Sandbox Code Playgroud)

那两个磅标志是什么意思?

c c-preprocessor

25
推荐指数
3
解决办法
6572
查看次数