C++ #,##,stdin,stdout,stderr

本文深入解析了C++中标准输入、输出和错误输出的相关实现细节,包括宏定义、内部结构和初始化过程,旨在帮助开发者理解底层原理并优化程序性能。
<pre name="code" class="cpp">// 标准输入,标准输出,标准错误输出
/* Declare _iob[] array */

#ifndef _STDIO_DEFINED
_CRTIMP FILE * __cdecl __iob_func(void);
#endif  /* _STDIO_DEFINED */

#ifndef _FILE_DEFINED
struct _iobuf {
        char *_ptr;
        int   _cnt;
        char *_base;
        int   _flag;
        int   _file;
        int   _charbuf;
        int   _bufsiz;
        char *_tmpfname;
        };
typedef struct _iobuf FILE;
#define _FILE_DEFINED
#endif

#ifndef _STDSTREAM_DEFINED#define stdin (&__iob_func()[0])#define stdout (&__iob_func()[1])#define stderr (&__iob_func()[2])#define _STDSTREAM_DEFINED#endif

/*
 * FILE descriptors; preset for stdin/out/err (note that the __tmpnum field
 * is not initialized)
 */
FILE _iob[_IOB_ENTRIES] = {
        /* _ptr, _cnt, _base,  _flag, _file, _charbuf, _bufsiz */

        /* stdin (_iob[0]) */

        { _bufin, 0, _bufin, _IOREAD | _IOYOURBUF, 0, 0, _INTERNAL_BUFSIZ },

        /* stdout (_iob[1]) */

        { NULL, 0, NULL, _IOWRT, 1, 0, 0 },

        /* stderr (_iob[3]) */

        { NULL, 0, NULL, _IOWRT, 2, 0, 0 },

};


/* These functions are for enabling STATIC_CPPLIB functionality */
_CRTIMP FILE * __cdecl __iob_func(void)
{
    return _iob;
}

#:将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号

##:连接符(concatenator),用来将两个Token连接为一个Token。注意这里连接的对象是Token就行,而不一定是宏的变量


C++中,`stderr` 是标准错误输出流,用于输出程序运行过程中的错误信息。以下是关于 `stderr` 的使用、作用及相关知识的详细介绍: ### 使用方法 在C++里,`stderr` 主要用于输出错误信息,它和 `stdout` 类似,不过 `stderr` 不会被缓冲,这意味着信息会立即显示出来。下面是一个简单的使用示例: ```cpp #include <cstdio> int main() { fprintf(stdout, "This is a normal output.\n"); fprintf(stderr, "This is an error message.\n"); return 0; } ``` 在这个示例中,`fprintf` 函数被用来分别向 `stdout` 和 `stderr` 输出信息。`stdout` 用于正常输出,而 `stderr` 用于输出错误信息 [^1]。 ### 作用 `stderr` 的主要作用是输出程序运行过程中的错误信息。由于它不会被缓冲,错误信息会立即显示,这样在程序崩溃或者出现严重错误时,错误信息能及时显示出来,方便开发者进行调试。例如,当程序打开文件失败时,可以使用 `stderr` 输出错误信息: ```cpp #include <cstdio> int main() { FILE* file = fopen("nonexistent_file.txt", "r"); if (file == nullptr) { fprintf(stderr, "Error: Could not open the file.\n"); return 1; } // 其他操作 fclose(file); return 0; } ``` 在这个示例中,如果文件打开失败,程序会通过 `stderr` 输出错误信息,提示用户文件无法打开 [^1]。 ### 相关知识 - **与 `stdout` 的区别**:`stdout` 和 `stderr` 虽然都是标准输出流,但它们存在重要区别。`stdout` 通常用于正常的程序输出,可能会被缓冲;而 `stderr` 专门用于输出错误信息,不会被缓冲,信息会立即显示 [^1]。 - **标准设备文件句柄**:在C/C++中,`stdin`、`stdout` 和 `stderr` 是三个标准设备文件句柄。它们在不同的操作系统平台上有不同的实现方式,比如在Linux下和Windows下的内存管理接口就有所不同 [^3][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值