gpt4 book ai didi

c++ - Visual Studios,在 C 代码中使用预编译 header

转载 作者:行者123 更新时间:2023-11-28 04:22:35 25 4
gpt4 key购买 nike

我正在将我在 Linux 上编写的代码导入 Visual Studio,并将 unistd.h 文件替换为我在 Stack Overflow 上找到的这个文件:

#ifndef _UNISTD_H
#define _UNISTD_H 1

/* This is intended as a drop-in replacement for unistd.h on Windows.
* Please add functionality as neeeded.
* https://stackoverflow.com/a/826027/1202830
*/

#include <stdlib.h>
#include <io.h>
#include <getopt.h> /* getopt at: https://gist.github.com/ashelly/7776712 */
#include <process.h> /* for getpid() and the exec..() family */
#include <direct.h> /* for _getcwd() and _chdir() */

#define srandom srand
#define random rand

/* Values for the second argument to access.
These may be OR'd together. */
#define R_OK 4 /* Test for read permission. */
#define W_OK 2 /* Test for write permission. */
//#define X_OK 1 /* execute permission - unsupported in windows*/
#define F_OK 0 /* Test for existence. */

#define access _access
#define dup2 _dup2
#define execve _execve
#define ftruncate _chsize
#define unlink _unlink
#define fileno _fileno
#define getcwd _getcwd
#define chdir _chdir
#define isatty _isatty
#define lseek _lseek
/* read, write, and close are NOT being #defined here, because while there are file handle specific versions for Windows, they probably don't work for sockets. You need to look at your app and consider whether to call e.g. closesocket(). */

#ifdef _WIN64
#define ssize_t __int64
#else
#define ssize_t long
#endif

#define STDIN_FILENO 0
#define STDOUT_FILENO 1
#define STDERR_FILENO 2
/* should be in some equivalent to <sys/types.h> */
typedef __int8 int8_t;
typedef __int16 int16_t;
typedef __int32 int32_t;
typedef __int64 int64_t;
typedef unsigned __int8 uint8_t;
typedef unsigned __int16 uint16_t;
typedef unsigned __int32 uint32_t;
typedef unsigned __int64 uint64_t;

#endif /* unistd.h */

这包括 github 上的 getopt.h 和 getopt.c 文件。我已将其与我的 main.cpp 一起包含在项目中。在每个代码的顶部,我添加了

#include "pch.h"

但是,我在执行此操作时遇到错误。 “预编译头文件来自以前版本的编译器,或者预编译头文件是 C++,而您正在从 C 使用它(反之亦然)”。这发生在 getopt.c 中。

现在我尝试将设置更改为“不使用预编译 header ”,但是当我这样做时,我在 unistd.h 第 48 行中收到错误“'int8_t':重新定义;不同的基本类型”。是否有另一个预编译 header header 我应该用于 C 代码或解决此问题的方法?谢谢!

编辑:另外,为了验证,我确实在每个 .h 文件的顶部都有#pragma once。

最佳答案

首先从您的 int8_t 中删除所有这些 typedef 定义( int16_tunistd.h 等)。文件。这些已经通过包含 <stdint.h> 来定义,可在 Windows 上使用。在禁用预编译 header 后,这可能会让您得到修复。

您可能已经明白,您不能同时将预编译头文件与 C 和 C++ 混合使用。几种可能的解决方案:

  1. 在单独的静态库 (lib) 中构建您的“C”代码,并使用它自己的预编译头文件(例如“pch.h”和“pch.c”)。或者干脆跳过这个项目的预编译头文件。然后使用 C++ 代码构建您的 EXE,并链接到您的 C 代码库。

  2. 或者简单地重命名您的 getopt.cgetopt.cpp .通过一两次快速修复,它可能会编译得很好。然后将所有带有预编译 header 的 C++ 代码一起构建。

关于c++ - Visual Studios,在 C 代码中使用预编译 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55084161/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com