簡體   English   中英

C 中的 C++ STD 庫

[英]C++ STD libraries in C

正如標題所示,我正在嘗試在項目中混合 C 和 C++ 源文件。

我的項目有以下文件

.
├── comms
│   ├── can.c
├── config_parsing
│   ├── config_parser.c
│   ├── file_operations.c
├── main.cpp
├── scheduler.c
├── signal_handler.c
├── thread_health.c
└── utilities
    ├── logger.c
    ├── ring_buffer.c
    ├── string_operations.c
    ├── time_conversions.c

在 Eclipse 中,它會編譯、構建和部署。 我正在添加來自供應商的代碼,因為它是購買代碼,所以我無法共享。 他們有 SSL 代碼,其中包含.h.c文件。 在頭文件中我們有

#include <openssl/err.h>
#include <string>
#include <vector>

在 C 文件中,我們有許多std::vector<unsigned char>std::string實例。 這不編譯。

我正在使用 Yocto 生成的 SDK 來構建我的應用程序,並且我可以確認包含路徑中存在適當的文件

/opt/fsl-imx-fb/5.10-hardknott/sysroots/cortexa7t2hf-neon-poky-linux-gnueabi/usr/include/c++/10.2.0

在線查看時,我看到了如何在 C++ 應用程序中正確包含 C 頭文件,但我似乎無法找到如何在 C 文件中使用std::vector 如果需要,我可以共享 Eclipse 編譯器/構建設置的圖像。

該應用程序在 Ubuntu 中構建。

要顯示的圖像在此處輸入圖像描述

不可能在 C 文件中使用std::vector ,因為 C 沒有名稱空間、類或模板。

最接近的是 C++ 代碼可以獲得指向向量內容的指針,並將指針傳遞給 C 代碼,C 代碼可以在那里讀取或寫入數據,因為 C 確實有指針。

如果你想提供答案,我很樂意接受! -c c++ 選項有效! – 邁克爾

很明顯, .c文件中的代碼是 C++ 代碼而不是C 代碼。 您發現的#include指令證明了這一點:

#include <string>
#include <vector>

編譯器前端(例如gccg++ )將嘗試根據文件擴展名(例如.c --> C 和.cpp --> C++)確定要使用的語言。

因此,即使我們使用g++編譯,由於.c擴展名(與預掃描文件內容相比),它仍然會編譯為 C。

所以,有一些補救措施:

  1. 將所有實際上是 C++ 代碼的.c文件重命名為.cpp
  2. -x c++添加到受影響文件的編譯器命令行以強制它將文件解釋為 C++ 代碼。 這適用於一前端: gccg++

通常,如果文件由您“擁有”,則 (1) 將是選擇的方法。 也就是說,以正確的方式修復一次

如果我們可以說服第 3 方供應商這樣做,那將是最好的(即)供應商申請(1)。

但是,如果供應商不會/不能這樣做並且您/您的公司重命名文件,則只要您從供應商處獲取新版本,問題就會再次出現。

因此,更清潔(即一次性修復)是執行 (2) 並修改您的構建/Makefile 以添加-x c++

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM