当前位置: 首页 > 知识库问答 >
问题:

如何编写确定其编译器的程序[重复]

堵鸿光
2023-03-14

需要写一个C程序。如果在C语言编译器中运行,程序应该打印“C”。如果它在编译器C中运行,它应该打印“C”。

无法使用预处理器指令。

In head仅用于将任何字符的大小与char大小进行比较,如:

sizeof(char)==sizeof('a')

下面是它的工作原理:

// C code:
#include <stdio.h>
int main()
{
    printf("%s", (sizeof(char)==sizeof('a') ? "C++" : "C"));
    return 0;
}

输出:C

// C++ code:
#include <stdio.h>
int main()
{
    printf("%s", (sizeof(char)==sizeof('a') ? "C++" : "C"));
    return 0;
}

输出:C

有更好的方法吗?

共有2个答案

酆晔
2023-03-14

标准http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1905.pdf包含关于C和C之间差异的附录

因此,它包含您使用的char与int差异,但也例如

更改:在C语言中,类声明将类名引入其声明的作用域,并将该名称的任何对象、函数或其他声明隐藏在封闭的作用域中。在C语言中,结构标记名的内部作用域声明从不隐藏外部作用域中对象或函数的名称

示例:(来自标准)

int x [99];
void f () {
     struct x { int a ; };
     sizeof (x ); /∗ size of the array in C ∗/
                  /∗ size of the struct in C++ ∗/
}

gcc在我的机器上给了396和G4

淳于知
2023-03-14

您可以检查__cplusplus宏以查看您是否被编译为c。

#include <stdio.h>

int main()
{
    printf("%s\n",
#if __cplusplus
            "C++"
#else
            "C"
#endif
          );
}
 类似资料:
  • 我用的是jdk 6。 我有一个界面: 我有一个名为Widget的抽象类,它实现了DisplayValueListener,并声明如下: 我还有另一个像这样扩展Widget的抽象类: 这是我从NetBeans中的编译器得到的信息: 名称冲突: setDisplayValue(Void, String)在相机Widget覆盖一个方法,其擦除与另一个方法相同,但都不覆盖另一个第一个方法:setDispl

  • 我使用maven命令来清理、构建整个项目、创建war并部署到服务器。我不能使用Intellij来做这件事,因为我只有社区版。它在与intellij相同的目录中构建项目。 为了加快速度,我编写了一个脚本,可以在本地“target”目录中找到比服务器中更新的已编译文件,并进行复制。虽然一切正常,但问题是Intellij并没有将使用maven编译的类视为应该跳过并重新构建整个项目的类。 目前它的工作原理

  • 我试图写一个翻译,将内缀转换为前缀。我知道语法,并阅读了“编译器原理,技术, 我不要求整个代码,我只需要一个例子,一个链接或任何东西来理解我应该如何做(不使用数组,动态数组,堆栈和任何在数据结构中教授的东西)。 在书中他们用这种方式将内缀转换为后缀

  • 配置tensorflow后,我尝试运行命令 但发生了一个错误,我尽了一切可能,但未能解决。 错误:跳过“//tensorflow/cc:tutorials\u example\u trainer”:加载包“tensorflow/cc”时出错:在读取扩展文件“cuda/build\u defs”时遇到错误。bzl':没有这样的包“@local_config_cuda//cuda”:回溯(最后一次调用

  • 来自Java规范SE 7版 §3.1 Unicode 程序是使用Unicode字符集编写的。 §3.2词汇翻译 使用以下三个词法翻译步骤,将原始Unicode字符流转换为一系列标记。。。 我很困惑,因为我用我的本机字符编码(Windows-1252)编写我的源代码,规范提到(?)都从原始Unicode字符流开始,然后执行词法翻译(包括Unicode转义转换)。 他们提到Unicode转义可以用来包