在專案 `include/compat/` 建立 `stdbool.h`:
/* compat/stdbool.h - C89 兼容實現 */
#ifndef COMPAT_STDBOOL_H
#define COMPAT_STDBOOL_H
#if !defined(__cplusplus) && !defined(__bool_true_false_are_defined)
#define bool _Bool
#define true 1
#define false 0
#define __bool_true_false_are_defined 1
#endif
#endif
在 CMake 中添加:
target_include_directories(my_target PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include/compat)
# 或全域
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include/compat)
注意:此方案需編譯器支援 `_Bool` 關鍵字 (C99 引入,GCC/Clang/MSVC 19+ 支援)。VC6.0 無 `_Bool`,需改用 `typedef int bool; enum {false=0, true=1};` 但失去型別安全。
/* project_types.h */
#ifndef PROJECT_TYPES_H
#define PROJECT_TYPES_H
typedef enum { FALSE = 0, TRUE = 1 } Bool;
#define BOOL_FALSE FALSE
#define BOOL_TRUE TRUE
#endif
全專案替換 `bool`→`Bool`、`true`→`TRUE`、`false`→`FALSE`。雖啰嗦,但在任何 ANSI C 編譯器下均可工作。
那個回覆完全跑題:列出的是 C++ 標準庫頭文件 (`
/* main.c */
#include
#include
#include
bool is_prime(uint32_t n) {
if (n <= 1) return false;
if (n <= 3) return true;
if (n % 2 == 0 || n % 3 == 0) return false;
for (uint32_t i = 5; i * i <= n; i += 6)
if (n % i == 0 || n % (i + 2) == 0) return false;
return true;
}
int main() {
uint32_t n = 9973;
printf("%u %s prime\n", n, is_prime(n) ? "is" : "is not");
return 0;
}
cmake_minimum_required(VERSION 3.20)
project(PrimeCheck LANGUAGES C)
set(CMAKE_C_STANDARD 17)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS OFF)
if (MSVC)
add_compile_options(/W4 /WX /permissive- /std:c17)
else()
add_compile_options(-Wall -Wextra -Wpedantic -Werror -std=c17)
endif()
add_executable(prime_check main.c)
工具鏈是生產力的基石。請投資 30 分鐘升級環境,節省未來無數小時與非標準編譯器搏鬥的時間。