我将文件address2lineutil
的扩展名从C更改为CPP。
当我使用.c
扩展程序编译GCC时,它编译正常并且工作正常。在我将其扩展名更改为.cpp
后,它会抛出这些错误:
./../include/libiberty.h:112:64: error: new declaration 'char* basename(const char*)'
In file included from sysdep.h:48:0,
from address2lineutil.cpp:5:
/usr/include/string.h:603:28: error: ambiguates old declaration 'const char* basename(const char*)'
address2lineutil.cpp: In function 'void slurp_symtab(bfd*)':
address2lineutil.cpp:74:26: error: invalid conversion from 'void*' to 'asymbol** {aka bfd_symbol**}' [-fpermissive]
address2lineutil.cpp: In function 'void translate_addresses(bfd*, asection*)':
address2lineutil.cpp:252:32: error: invalid conversion from 'const char*' to 'char*' [-fpermissive]
我的address2lineutil.cpp标题:
#include "sysdep.h"
#include "bfd.h"
#include "getopt.h"
#include "libiberty.h"
#include "demangle.h"
#include "bucomm.h"
#include "elf-bfd.h"
#include "address2lineutil.h"
#include <string.h>
#include <execinfo.h>
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <unistd.h>
static bfd_boolean unwind_inlines; /* -i, unwind inlined functions. */
static bfd_boolean with_addresses; /* -a, show addresses. */
static bfd_boolean with_functions; /* -f, show function names. */
static bfd_boolean do_demangle; /* -C, demangle names. */
static bfd_boolean pretty_print; /* -p, print on one line. */
static bfd_boolean base_names; /* -s, strip directory names. */
static int naddr; /* Number of addresses to process. */
static char **addr; /* Hex addresses to process. */
static asymbol **syms; /* Symbol table. */
static void slurp_symtab (bfd *);
static void find_address_in_section (bfd *, asection *, void *);
static void find_offset_in_section (bfd *, asection *);
static void translate_addresses (bfd *, asection *);
答案 0 :(得分:1)
C ++具有与C不同的类型检查规则(至少比旧的“C”)。它默认情况下不会让你“逃脱”C所做的事情。
您需要开始学习如何解释输出错误。打开“address2lineutil.cpp”。转到第74行。查看传递的类型。毫无疑问,它是“void *”类型。但是需要的是输入asymbol **。你确定的传递是类型asymbol **吗?如果是这样,你可以简单地重新解释它。
在同一个文件中,转到第252行。你有一个const char *并试图传递它(可能是一个想要char *的函数)。许多旧的C函数需要char *,即使它们不会更改传递给它们的字符串。如果你确定是这种情况,你可以只是const_cast它。
以上只是对可以做什么来进行编译的描述。至于你真正应该做什么,我无法告诉你,因为我不知道你的代码。也许第252行中想要“char *”的函数可以将其签名更改为采用const char *?或者,另一方面,如果它实际上改变了它给出的字符串,那么你应该不只是强制转换,而是应该创建一个非const字符串缓冲区并传递它。
真的,你应该做的事情超出了这个答案的范围。
答案 1 :(得分:1)
[MiddlewareFilter(typeof(JsReportPipeline))]
public IActionResult Invoice()
{
HttpContext.JsReportFeature().Recipe(Recipe.ChromePdf);
return View();
}
中可以隐式转换为另一种指针类型,但不能在C ++中转换。你需要插一个演员。答案 2 :(得分:1)
将程序从C转换为C ++不仅仅是更改文件名后缀和您使用的编译器命令。例如,自1998年以来,{C}一直弃用stdlib.h
,stdio.h
和string.h
。相反,您应该使用cstdlib
,cstdio
和{{1} };然后您可以从“cstring
”命名空间访问其内容。这应该解决您的std
问题。
答案 3 :(得分:0)
char* basename(const char*)
const char* basename(const char*)
想象一下,如果你调用这样的函数会发生什么:
basename("test");
结果现在是const char*
还是char*
?编译器是否应该生成伪随机数并在它们之间进行选择?
如果你有课,你可以这样做:
class Test
{
public:
char* basename(const char*);
const char* basename(const char*) const; //Assure that nothing in the class changes (except mutable)
};
如果你没有,那么在一个超载之间进行选择并将另一个重载扔进你的回收站 这是C ++,而不是纯粹的C。