如何在将文件扩展名从c更改为cpp后解决C ++中的歧义错误?

时间:2017-08-23 10:04:35

标签: c++ c gcc g++

我将文件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 *);

4 个答案:

答案 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)

  1. 重新定义基名。这个特殊的错误在libiberty.h中,这不是你的代码,而是来自某些第三方软件包。更新到较新版本的软件包或自行修复。最简单的方法是从libiberty.h中删除错误的重新定义。
  2. 无效转换。在C [MiddlewareFilter(typeof(JsReportPipeline))] public IActionResult Invoice() { HttpContext.JsReportFeature().Recipe(Recipe.ChromePdf); return View(); } 中可以隐式转换为另一种指针类型,但不能在C ++中转换。你需要插一个演员。

答案 2 :(得分:1)

将程序从C转换为C ++不仅仅是更改文件名后缀和您使用的编译器命令。例如,自1998年以来,{C}一直弃用stdlib.hstdio.hstring.h。相反,您应该使用cstdlibcstdio和{{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。