0

我尝试使用 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编译失败的原因是什么?
  • 我怎样才能让它工作,我错过了什么?
4

1 回答 1

0

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

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

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

于 2021-01-15T14:16:48.233 回答