字符串常量前的非限定id

Unqualified-id before string constant

本文关键字:id 常量 字符串      更新时间:2023-10-16

在编译以下代码时,我得到错误"expected unqualified-id before string constant"

In file "Notification_Constants.h"
namespace NOTIFICATION_CONSTANTS
{
    #define SERVICE_EMAIL "service@company.com"
}

sendmail .cpp文件

#include "Notification_Constants.h"
void UserPreferences::get_senders_email(String &_email)
{
    _email = NOTIFICATION_CONSTANTS::SERVICE_EMAIL;
}

如果我像下面这样赋值,它可以正常工作,那么编译错误的原因是什么?

_email = SERVICE_EMAIL;

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

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

class String
{
public:
String();
String(const String& src);
String(const char *new_str);
String& operator=(const String& src);
String& operator=(const char *new_str);
};

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

#define SERVICE_EMAIL "service@company.com"

第二,根本不应该使用#define。使用const变量代替:

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

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

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

:

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

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

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

解决方案是删除名称空间限定符:
_email = SERVICE_EMAIL;

更好的解决方案:

如果你不能访问#define,你应该把它包装在一个头文件中,如果可能的话:

#include "Notification_Constants.h"
namespace NOTIFICATION_CONSTANTS {
    const String REAL_SERVICE_EMAIL = SERVICE_EMAIL;
}

,然后使用NOTIFICATION_CONSTANTS::REAL_SERVICE_EMAIL,它具有作用域,是类型,是名称空间的适当成员,等等。

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

#define SERVICE_EMAIL "service@company.com"

但是,即使在后一种解决方案中,它也应该失败。也许你的代码片段没有显示出真正的问题。

#define SERVICE_EMAIL "service@company.com"

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

试题:

 #define SERVICE_EMAIL "service@company.com"