gpt4 book ai didi

c++ - 为什么对于gcc 'UNIX'和 'unix'宏不是同一回事?

转载 作者:行者123 更新时间:2023-12-01 20:26:15 25 4
gpt4 key购买 nike

我在Ubuntu Mate中使用gcc有一个奇怪的问题。

我需要编写一个使用第三方C库的golang程序,但我遇到了问题。

当我尝试使用此代码连接第三方库时:

package main

// #cgo CFLAGS: -I /opt/cprocsp/include/interfaces/
// #cgo CFLAGS: -I /opt/cprocsp/include/
// #cgo CFLAGS: -I /opt/cprocsp/include/cpcsp/
// #include <stddef.h>
// #include "wincspc.h"
// #include "wincspc_int.h"
import "C"

func main() {
var CSPConfig C.CPC_CONFIG
C.CPCGetDefaultConfig(&CSPConfig, nil)
CSPConfig.logConfig.name = string(C.MODNAME)
}

我收到一个编译错误:
In file included from /opt/cprocsp/include/cpcsp/wincspc.h:28:0,
from ./gost.go:7:
/opt/cprocsp/include/cpcsp/WinCryptEx.h:35:10: fatal error: wincrypt.h: No such file or directory
#include <wincrypt.h>
^~~~~~~~~~~~
compilation terminated.

我不知道这个错误是什么意思。接下来,我决定打开WinCryptEx.h,然后在其中找到以下行:
#if defined UNIX || defined CSP_LITE
#include "CSP_WinCrypt.h"
#else // UNIX
#include <wincrypt.h>
#endif // UNIX

所以我意识到编译器运行else语句(但是我希望它运行if语句,因为我的操作系统是Linux)。为了确认该问题,我决定编写一个C示例。
#if defined UNIX
#include "CSP_WinCrypt.h"
#else
#include <wincrypt.h>
#endif

int main()
{
printf("Hello world");
}

当我尝试运行此示例时,出现相同的错误。
但是后来我决定尝试运行以下代码:
#if defined unix
#include "CSP_WinCrypt.h"
#else
#include <wincrypt.h>
#endif

int main()
{
printf("Hello world");
}

而且效果很好!编译器根据需要运行if语句。
我不明白为什么。

我无法更改第三方库。因此,我需要编译器可以在'UNIX'宏下正常工作。

有没有人有办法解决吗?提前致谢。

最佳答案

This query to a popular Internet search engine仅在正确的上下文中提供与单词“unix”匹配的单个页面:this page on system-specific macros

该页面暗示了两件事:

  • GCC不保证定义了UNIX宏。
  • unix宏被描述为“通用”,但是没有
    陈述了必须存在的事实:

    However, historically system-specific macros have had names with no special prefix; for instance, it is common to find unix defined on Unix systems. For all such macros, GCC provides a parallel macro with two underscores added at the beginning and the end. If unix is defined, __unix__ will be defined too.


  • 无论哪种情况,C中的标识符都是区分大小写的,并且由其预处理器处理的符号也区分大小写,因此 unixUNIX是两个不相关的符号。

    在您的情况下,我应该颠倒逻辑并针对Windows进行测试,而不是相反。
    在那里,符号 _WIN32应该同时由MinGW和MSVC定义。

    关于c++ - 为什么对于gcc 'UNIX'和 'unix'宏不是同一回事?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62120549/

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