LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: lpsir

哪位提供一些#define用法的案例

[复制链接]
发表于 2007-9-2 14:54:37 | 显示全部楼层
谢谢楼上的解答,那我顺便帮你翻译一下吧,方便其他朋友查看:

#if defined(_MSC_VER)和#if defined _MSC_VER的含义是一样的。
可以使用如下的格式来做含有两个或多个条件的判断:
#if defined (__vax__) || defined (__ns16000__)

语句#if defined BUFSIZE && BUFSIZE >= 1024等价于
#if BUFSIZE >= 1024

最后一句有点看不懂:
If the defined operator appears as a result of a macro expansion, the C standard says the behavior is undefined. GNU cpp treats it as a genuine defined operator and evaluates it normally.
如果已定义的操作符以宏扩展的形式出现,那C标准将认为这是非法操作,但是C++会正常对待。
可是我写了如下一段代码,用g++编译通不过,提示说“宏名必须为标识符”,我有些不解:
#define + XX
#ifdef +
  putchar('+');
#endif
回复 支持 反对

使用道具 举报

发表于 2007-9-2 17:59:07 | 显示全部楼层
GNU cpp 是指 GNU C 预处理器,而不是 C++

因此
If the defined operator appears as a result of a macro expansion, the C standard says the behavior is undefined. GNU cpp treats it as a genuine defined operator and evaluates it normally.
也许翻译成下面的样子更好
以宏扩展结果的形式出现的 defined 运算符根据 C 标准的规定,是属于未定义行为的。 GNU 的 C 预处理器把这种情况下的 defined 视为一个正式的运算符,并以通常的方法对其进行处理。

这种生硬的翻译还是无法让人理解它的含义,那么我就根据个人的理解对它进行一下说明,不保证这种解释是正确的,但至少可以保证提到的 gcc 相关的内容是经过实践检验的

假如有这样一段代码

  1. #define A
  2. #define XX defined(A)
  3. #if XX
  4. #  warning 123
  5. #else
  6. #  warning 456
  7. #endif
复制代码

那么编译时给出的信息应该是怎样的呢?上面那句翻译中的意思应该是指在 C 语言标准中这种情况属于未定义情况,就是说不同的编译器可以自行对其做出处理。对 gcc 编译而言,这段代码给出 123 的警告,而如果没有第一行关于 A 的定义,那么就给出 456 的警告。

这与楼上兄弟的理解是有较大的偏差的

另外宏名必须是标识符,这也是 C 标准规定的,有效的宏替换的构成与函数名,变量名等是相同的,要满足 [_a-zA-Z][_a-zA-Z0-9]* 的形式。而且出现在字符串中的内容是不会被视为宏名的。因此即使有了 #define XX 123 这样的语句,那么 printf("%s\n", "XX"); 也还是会输出 XX 而不是 123

如果想实现楼上兄弟预期的目的,大家一般是写成如下形式的

  1. #define ADD '+'
  2. #ifdef ADD
  3. putchar(ADD);
  4. #endif
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表