【问题标题】:Compilation error C2048 while compiling in visual studio 2019 MSVC, but works fine with clang++?在 Visual Studio 中编译时出现编译错误 C2048,但在 clang++ 中可以正常工作吗?
【发布时间】:2021-04-20 13:21:33
【问题描述】:

我尝试使用 clang 编译器编译以下示例代码,它工作正常。

  • 编译器详细信息:Apple clang 版本 12.0.0 (clang-1200.0.32.28)
  • 目标:x86_64-apple-darwin20.1.0
#include <iostream>
#include <stdio.h>

int __cdecl printf(const char* format, ...)
{
    std::cout<<"My printf function"<<std::endl;
    return 0;
}

int main()
{
    printf("Standard printf function\n");
    return 0;
}

但是,当我尝试在 Visual Studio 2019 或 g++ 中编译时,它给出了编译错误。

错误 C2084:函数 'int printf(const char *const ,...)' 已经有一个主体

  • msvc编译失败的原因是什么?
  • 我怎样才能让它工作,我错过了什么?

【问题讨论】:

  • 你得到的错误的全文是什么?
  • error C2084: function 'int printf(const char *const ,...)' already has a body

标签: visual-c++ compiler-errors g++ clang++ weak-linking


【解决方案1】:

从您的代码中,您有意尝试使用您自己版本的 printf 函数。

预计会出现错误 C2084。您正在重新定义已经定义的东西。这很危险,你要意识到你所承担的风险。它是整个库的一部分,可能会出现任何 UB(未定义行为)。我不会玩那个。从我的角度来看,是 g++ 没有报告错误,但可能是 printf 的 g++/libc 原型与您编写的略有不同,甚至函数 printf 是在标头中声明但未在其中定义。

如果你真的想这样下去,我强烈建议你在另一个源文件中定义你的printf,并在链接时隐藏 libc 实现。这应该是允许的(可能会出现警告和错误,但每个链接器都有一个覆盖)。

【讨论】:

  • 您能否再次阅读我编辑过的问题。我的目标是实现我的 printf 函数版本,但想使用 stdio.h 中提供的其他标准函数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多