在C / C ++中识别数据类型

时间:2016-02-01 15:49:36

标签: c++

我使用了以下简单代码:

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字节数据类型,那么我该怎么办?可能吗 ?

3 个答案:

答案 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来更改关键字的行为是有害的。