gpt4 book ai didi

c++ - 字符串常量前的 Unqualified-id

转载 作者:太空宇宙 更新时间:2023-11-03 10:20:49 26 4
gpt4 key购买 nike

在编译以下代码时出现错误“字符串常量之前的预期不合格 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);
};

最佳答案

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

#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";

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

解决方案是删除 namespace 限定符:

_email = SERVICE_EMAIL;

更好的解决方案:

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

#include "Notification_Constants.h"

namespace NOTIFICATION_CONSTANTS {
const String REAL_SERVICE_EMAIL = SERVICE_EMAIL;
}

然后使用 NOTIFICATION_CONSTANTS::REAL_SERVICE_EMAIL相反,它具有范围,是一种类型,是命名空间的适当成员,等等。

关于c++ - 字符串常量前的 Unqualified-id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5896230/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com