我使用了以下简单代码:
var ArchiveImage = $(".blog img");
if (ArchiveImage.width() > ArchiveImage.height()){
//landscape
ArchiveImage.width() = 480;
} else if (ArchiveImage.width() < ArchiveImage.height()){
//portrait
} else {
//square.
}
我认为如果在程序中使用#define char long long int
int main()
{
cout<<sizeof(char) << endl;
// want to use char as a 1 byte data type
}
,则会在编译时扩展定义。但是,现在如果我想将#define
用作1字节数据类型,那么我该怎么办?可能吗 ?
答案 0 :(得分:3)
17.6.4.3.1宏名称[macro.names]
1包含标准库标题的翻译单元不得在任何标准库标题中声明#define或#undef名称。
2翻译单位不得#define或#undef名称与关键字词汇相同。
所以无论你在定义之后做什么,程序语义都是未定义的。
<强>更新强>: 仅当您包含标准库中的任何标头时,技术行为才是未定义的。你似乎这样做,因为你正在使用cout。无论如何不包括任何标准头是一个非常重的约束。
之前的标准报价以:
开头17.6.4.3保留名称[reserved.names]
1 C ++标准库保留以下类型的名称:
- 宏
- 全球名称
- 具有外部链接的名称
2如果程序在保留它的上下文中声明或定义名称,除了本条款明确允许的名称外,其行为是未定义的。
答案 1 :(得分:1)
你必须使用
#undef char
之后,您可以根据需要使用char。
但用宏重新定义关键字真的很危险。
答案 2 :(得分:1)
一旦你#define
某事,它就会被定义为编译单元其余部分的那个值。
在特定的编辑单元中,您可以使用#define
撤消#undef
。
我确信您不需要被告知使用#define
来更改关键字的行为是有害的。