【问题标题】:About Use of #include Preprocessor Directive in C++关于 C++ 中#include 预处理器指令的使用
【发布时间】:2013-08-08 21:13:07
【问题描述】:

我在使用 g++ 编译器的 C++ 中偶然发现以下编译错误:

error on line line 1 with message:
invalid preprocessing directive #a

(在字符 a 上方有一个插入符号),然后是另一个,可能是随之而来的错误,第 4 行带有消息:

cout was not declared in this scope. 

我使用的编辑器是带有 mingw 的 Code blocks 10.05。我尝试从 iostream 文件的 include 语句中删除 .h 扩展名;在不同的文件编码选项之间切换;并将尖括号替换为单引号和双引号。i我坚持下去。如果它是重复的,请原谅(尽管我经历了几个已经提出的相关问题)。 下面的代码说明了这个问题:

#‪include ‬<iostream.h>
int main()
{
cout<< "abc"+8;
cout<< "def"+4;
cout<< "ha";
return 0;
}

【问题讨论】:

  • &lt;iostream&gt; no .h
  • 关键字using 不是一个好主意——命名空间冲突意味着坏事发生。只需明确调用它,例如std::cout 或最坏情况下的别名,如 namespace dino = some::long::namespace
  • "abc"+8 应该做什么?

标签: c++ include iostream


【解决方案1】:

cout 存在于命名空间std

所以

#‪include‬<iostream>
//...
std::cout << "abc" << 8;
//...

#‪include‬<iostream>
using namespace std;

//...

#‪include‬<iostream>
using std::cout;

//...

如果我只使用一次或两次,我倾向于使用第一个,如果我使用命名空间中的许多不同部分(并且仅在 cpp 文件中),则第二个,或者如果我使用第三个' m 只使用命名空间中的一个或两个,但多次使用相同的一对。

另外,如 cmets 所述,请勿在标题中使用第二个。见:"using namespace" in c++ headers

另外,您的#include 中有一个无效字符。您可以在十六进制编辑器中查看它,或者注意 stackoverflow 如何突出显示它们不同:

#‪include‬<iostream>
#include<iostream>

完整的工作代码:

#include<iostream>

using std::cout;

int main()
{
    cout << "abc" << 8;
    cout << "def" << 4;
    cout << "ha";
    return 0;
}

在我更正尝试将 8 添加到 char* 后产生以下输出 abc8def4ha

【讨论】:

  • 但你不应该永远将第二个放在标题中,很多人出于类似的原因讨厌它。
  • @McAden,在您建议的解决方案的第一种情况下,第 1 行的错误消息保持不变。但是,第 4 行和其余 cout 调用的错误消息是:'cout' is not 'std' 的成员;在第二种情况下,错误列表仍然存在,如问题中所述;第三种情况还会产生以下错误:第 1 行带有消息:无效的预处理指令 #a(在 a 上带有插入符号);第 1 行带有消息“std::cout”的 2 尚未声明;带有消息“cout”的第 5 行未在此范围内声明。
  • 您的问题是您的#include 中的字符无效。我猜你是从某个地方复制/粘贴的
  • 谢谢!重新输入代码(在问题中提到),添加语句“使用 std::cout”可以正常工作,并给出以下假设的输出哈哈哈 - 令我惊讶! (因为我不知道怎么做??)。
  • 您的字符无效。见上面 StackOverflow 的语法高亮显示甚至没有将它们视为相同的地方。我很高兴这个答案很有帮助。
【解决方案2】:

你必须使用std::cout,这意味着“cout”关键字是标准库的一部分。

【讨论】:

    【解决方案3】:

    “无效指令”错误是由#include指令中的一些不可见的Unicode字符引起的;也许您是从在代码中嵌入了一些格式化字符的网站复制的。如果您在十六进制编辑器中查看源代码,可以在问题中看到它们。应该通过删除并重新输入#include 行来修复该错误。

    您可能还会遇到其他错误,因为代码已经过时了十五年;大多数现代编译器不提供预标准库。这些天来,标准库头文件没有.h 扩展名:

    #include <iostream>
    

    而且他们声明的几乎所有名称都在 std 命名空间内:

    std::cout << "ha";
    

    最后,"abc"+8 没有做任何明智的事情。字符串字面量是一个由四个字符组成的数组,+8 试图为您提供指向不存在的第九个字符的指针。结果是未定义的行为。

    如果您想打印“abc”后跟“8”,那么您需要:

    std::cout << "abc" << 8;
    

    【讨论】:

    • 我已经在问题中提到,我尝试在 iostream 声明中不使用 .h 扩展名,以便对错误列表没有任何影响。即使我写了 'std::cout
    • @ChandanKumar:抱歉,我没有注意到您已经尝试纠正它。我不知道“无效指令”错误是什么;听起来您可能以某种方式在源文件中使用了非 ASCII 字符。尝试删除并重新输入 #include 行。
    • 谢谢!这真是令人鼓舞。是的,我从其他地方复制了代码。让我试试手动重新输入是否能解决问题。
    • @ChandanKumar:确实,如果我在十六进制编辑器中查看您的代码,我会在 include 周围看到一些奇怪的 Unicode 格式字符。这可能会破坏编译器。我已经用真正的问题更新了答案。
    • @ChandanKumar: "hahaha" 将是未定义行为的结果:如果你明白了,那是因为你的编译器碰巧将字符串文字一个接一个地放在内存中,所以狡猾的算术 ( "abc"+8) 恰好给你一个指向 "ha" 的指针。其他编译器可能会打印其他内容、崩溃或重新格式化您的硬盘,所以不要尝试自己编写类似的代码。
    【解决方案4】:

    尝试像这样使用它:-

    #‪include ‬<iostream>
    using std :: cout;
    

    coutstd 库的一部分

    【讨论】:

    • 通常不鼓励使用using namespace std;。你对此没有什么要说的吗?
    【解决方案5】:

    如果您在 a 上方有插入符号,请尝试重新键入您的 #include。 您可能不小心输入了看起来相似但代码不同的替代 i。 关于 std:: 的建议仅与您遇到的第二个错误有关。 我也没有完全理解你想用“abc”+8 实现什么。

    【讨论】:

      猜你喜欢
      • 2010-10-01
      • 1970-01-01
      • 2017-02-11
      • 1970-01-01
      • 2019-07-08
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多