Compiler construction 如何在任何拱门上强制将long的大小设置为8字节?

Compiler construction 如何在任何拱门上强制将long的大小设置为8字节?,compiler-construction,64-bit,typedef,long-integer,sizeof,Compiler Construction,64 Bit,Typedef,Long Integer,Sizeof,我希望我的long是8字节,不管我是在32位模式还是64位模式下编译。我正在使用MSVC,目前我不太关心跨平台性。我试着做一些事情,比如 #define long __int64 或 但是第一个错误会导致其他文件中出现大量编译错误,而第二个错误似乎是编译器本身无法接受的。我不会更改保留类型的默认行为。更好的做法是创建一个新类型,如果您喜欢并使用它 考虑一个案例,当您包含第三方数据库时,它的“h”文件是这样的: void func1(long number); 当代码包含“h”文件时,它会将“

我希望我的long是8字节,不管我是在32位模式还是64位模式下编译。我正在使用MSVC,目前我不太关心跨平台性。我试着做一些事情,比如

#define long __int64


但是第一个错误会导致其他文件中出现大量编译错误,而第二个错误似乎是编译器本身无法接受的。

我不会更改保留类型的默认行为。更好的做法是创建一个新类型,如果您喜欢并使用它

考虑一个案例,当您包含第三方数据库时,它的“h”文件是这样的:

void func1(long number);

当代码包含“h”文件时,它会将“number”参数视为64位,但当lib的原始“c”文件包含该“h”时,它会认为“number”是32位。这将导致链接阶段出现问题。

我所有的代码都锁定在特定的名称空间中,如果我能使“long”仅在该名称空间中作为“64位整数”工作,也许我可以避免您提到的问题?这可能是一种可能性,但我仍然相信一个好的做法是创建一个新类型“myLong”,“myInt64”或者任何64位的东西。这也将减少阅读您代码的人的困惑。或者更好的是,只需使用始终为64位的
long
。好吧,我这样做,因为我发现“long-long”非常难看,“myLong”、“long”、“long”等也没有更好。我不同意,一切都比接受一个已知含义的东西,并在你自己的代码中赋予它不同的含义要好。从长远来看,有些人(甚至可能是你)可能会错过定义,并期望在32位机器上的long为32位。这是不可能的。如果您关心位大小,那么应该包括stdint.h并使用int64\t。使用
long-long
在今天有效,但在十年后可能不起作用。
void func1(long number);