【问题标题】:include C code on C++ strange error在 C++ 奇怪的错误中包含 C 代码
【发布时间】:2014-02-04 19:46:38
【问题描述】:

我正在尝试在 c++ 代码上使用一些 C 函数(由我制作)。 我正在使用 Eclipse。

Main.cpp 代码:

#include <Windows.h>
extern "C" {
   #include "f.h"
}
int main(){
   return 1;
}

现在 f.h 有很多功能,但是在具有此初始化行的功能上却给了我错误。 所以我的f.h 代码只有这个:

char o[9] = "00000000\0";

但是……

initializer-string for array of chars is too long   f.h

如果我用 C 编译它,它会工作......为什么?

【问题讨论】:

  • 如果您在 C 中为 char 数组指定一个长度,并使用那么多字符对其进行初始化,则不会将 0 终止符附加到字符串中。不过,我不知道 C++ 中的情况如何,但我知道这是有效的 C。
  • 是的,事实上在 C 中是有效的!在 C++ 中不是!但是对于 extern "C",我想让它在 C++ 中有效(但它不起作用)
  • afaik, extern "C" 制作函数原型 C 函数原型。我认为这主要是关于调用约定和使用的名称修饰,而不是关于什么语法是有效的。但我不知道 C++ 有多好……
  • 顺便说一句……用例是什么?您想在字符串常量中使用省略 0 终止符的 C 特性并手动提供。为什么?
  • 这只是一个例子,我不想修改我所有的 C 函数。当然我可以用 C++ 重写它们,但我想直接在 C 中加载它...

标签: c++ c eclipse include


【解决方案1】:

它试图将 10 个字符复制到您定义为 9 个字符长的数组中。

试试:

char o[9] = "00000000";

它的末尾已经有一个空字符。或者让编译器进行计数。即。

char o[] = "00000000";

【讨论】:

  • in c 是有效的,我正在尝试用 C 编译这个头文件
【解决方案2】:

没有必要明确写 \0,如果你用双引号括起来它被视为 NULL 终止的字符串。

【讨论】:

  • in c 是有效的,我正在尝试从 c++ 项目中用 C 编译这个头文件
  • @user2903357 我用过extern "C",还是不行。
【解决方案3】:

原因是,c-string 会自动在末尾附加一个 '\0'。所以,

"00000000\0"

实际内存表示为“00000000\0\0”,即 10 个字节。

【讨论】:

  • 只有当你没有明确给出长度时才会这样。
【解决方案4】:

您告诉编译器您将为它提供 9 个字符,而您只提供了 8 个字符,只是因为在计算字符时不计算空字符。

char o[8] = "00000000\0";

试试看。这也可能有效。

char o[8] = "00000000";

【讨论】:

  • 实际上他们提供了 10 个字符,而您的数组太小了 1 个元素。
  • char o[9] = "00000000\0";在 C 中工作!我正在尝试将 f.h 代码编译为 C 而不是 c++
  • @user2903357;在 C 中,这是完全有效的,请参阅我对您的问题的评论。不过,我不确定 C++。
  • @CaptainObvlious;它有效的,你没有覆盖任何界限。如果你给出一个明确的长度 N 和一个正好有 N 个元素的初始化器,那么 0 终止符将被省略,一切都在界限内。仅当有足够的空间时才会附加 0 终止符。
猜你喜欢
  • 2014-04-09
  • 1970-01-01
  • 1970-01-01
  • 2012-11-01
  • 2018-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多