【发布时间】:2009-11-04 14:38:30
【问题描述】:
我正在使用 gcc 4.1.2 在 RHEL 5.1 64 位平台上运行。
我有一个实用函数:
void str_concat(char *buff, int buffSize, ...);
连接 char * 传入可变参数列表(...),而最后一个参数应该为 NULL,以指定参数的结尾。在 64 位系统上,NULL 是 8 个字节。
现在解决问题。我的应用程序直接/间接包含 2 个 stddef.h 文件。
第一个是/usr/include/linux/stddef.h,它定义NULL如下:
#undef NULL
#if defined(__cplusplus)
#define NULL 0
#else
#define NULL ((void *)0)
#endif
第二个是/usr/lib/gcc/x86_64-redhat-linux/4.1.2/include/stddef.h
#if defined (_STDDEF_H) || defined (__need_NULL)
#undef NULL /* in case <stdio.h> has defined it. */
#ifdef __GNUG__
#define NULL __null
#else /* G++ */
#ifndef __cplusplus
#define NULL ((void *)0)
#else /* C++ */
#define NULL 0
#endif /* C++ */
#endif /* G++ */
#endif /* NULL not defined and <stddef.h> or need NULL. */
#undef __need_NULL
当然我需要第二个,因为它将 NULL 定义为 __null(8 个字节),而第一个将其定义为整数 0(4 个字节)。
如何防止 /usr/include/linux/stddef.h 被错误地包含?
更新:
-
编译行非常简单:
g++ -Wall -fmessage-length=0 -g -pthread
许多人建议通过 (void *)0。这当然会奏效。该功能在很多地方使用的问题,我的意思是很多地方。我想找到能够满足 C++ 标准承诺的解决方案 - NULL 为 8 字节大小。
【问题讨论】:
-
如果我们有您的编译行,查看包含路径中的目录会有所帮助。
-
是否可以看到生成的程序集输出?
-
我预处理文件 (gcc -E) 以证明 NULL 被 0 替换。
-
可以用-S编译看看生成的源码吗?
-
“C++ 标准承诺的内容 - 8 字节大小的 NULL”。不,它非常不承诺任何这样的事情。附近没有。