【问题标题】:Unqualified-id before string constant字符串常量前的非限定 ID
【发布时间】:2011-08-19 06:26:21
【问题描述】:

在编译以下代码时,我收到错误“字符串常量之前预期的 unqualified-id”

In file "Notification_Constants.h"

namespace NOTIFICATION_CONSTANTS
{
    #define SERVICE_EMAIL "service@company.com"
}

在文件 SendEmail.cpp 中

#include "Notification_Constants.h"

void UserPreferences::get_senders_email(String &_email)
{
    _email = NOTIFICATION_CONSTANTS::SERVICE_EMAIL;
}

如果我像下面这样分配它可以正常工作,编译错误的原因是什么。

_email = SERVICE_EMAIL;

有一个类似的question,但没有提到原因。

带有相关方法的字符串类声明

class String
{
public:

String();
String(const String& src);
String(const char *new_str);
String& operator=(const String& src);
String& operator=(const char *new_str);
};

【问题讨论】:

  • SERVICE_EMAIL 字符串用双引号括起来,是复制粘贴错误
  • 我们没有足够的信息来正确识别问题。请至少提供有关您的String 类型的更多信息。
  • 我添加了引号,以免其他人感到困惑。
  • @Lstor 我已经用相关方法在类 String 中声明方法更新了问题
  • 你在哪一行得到错误?还有其他错误吗?根据您目前提供的信息,应该没有错误。

标签: c++ string c-preprocessor


【解决方案1】:

首先,您应该在电子邮件地址周围加上引号:

#define SERVICE_EMAIL "service@company.com"

其次,你根本不应该使用#define。请改用const 变量:

const String SERVICE_EMAIL = "service@company.com";

#defines 类型不安全,没有作用域,通常是邪恶的。

最后,您可能需要考虑使用 std::string 而不是 String 类。

更新

问题在于预处理器#defines 只不过是文本替换。预处理器完成后,您的编译器将看到

_email = NOTIFICATION_CONSTANTS::"service@company.com";

该命名空间中没有字符串常量。 SERVICE_EMAIL 不是任何类型的标识符 - 它只是指示预处理器将任何出现的 SERVICE_EMAIL 替换为 "service@company.com"

解决办法是去掉命名空间限定符:

_email = SERVICE_EMAIL;

更好的解决方案:

如果您无权访问#define,则应尽可能将其包装在头文件中:

#include "Notification_Constants.h"

namespace NOTIFICATION_CONSTANTS {
    const String REAL_SERVICE_EMAIL = SERVICE_EMAIL;
}

然后改用NOTIFICATION_CONSTANTS::REAL_SERVICE_EMAIL,它有作用域,是一种类型,是命名空间的适当成员,等等。

【讨论】:

  • sorry SERVICE_EMAIL 字符串用双引号括起来,是复制粘贴错误。问题是它是在我无法修改的其他域中定义的,我如何从中构造一个字符串对象。
【解决方案2】:

问题是,我认为由于我不知道String 类型,SERVICE_EMAIL 应该是字符串文字:

#define SERVICE_EMAIL "service@company.com"

但是,即使在后一种解决方案中,它也应该会失败。也许您的代码 sn-p 没有显示真正的问题。

【讨论】:

    【解决方案3】:
    #define SERVICE_EMAIL "service@company.com"
    

    【讨论】:

      【解决方案4】:

      service@company.com 的类型是什么? 我认为您希望使用字符串来存储电子邮件地址。

      试试:

       #define SERVICE_EMAIL "service@company.com"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-03
        • 2023-03-07
        • 2015-06-20
        • 1970-01-01
        • 2015-09-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多