嵌入式C语言支持bool数据类型吗?[关闭]

nqwrtyyt  于 2023-04-05  发布在  其他
关注(0)|答案(2)|浏览(464)

已关闭。此问题需要details or clarity。当前不接受答案。
**想要改进此问题?**添加详细信息并通过editing this post阐明问题。

5天前关闭。
Improve this question
他们为avr MCU写了以下代码,我用Arduino IDE编译并上传了代码,我没有得到任何错误,代码工作正常,但我记得C程序不支持bool数据类型。这段代码在Linux上仍然可以用avr-gcc编译吗?

//The following code is written for ATmega328P microcontroller
// Turns ON the led on a click of a switch and Turns OFF it again another click
#include <avr/io.h>
#include <avr/interrupt.h>

#define LED_PIN   PB5
#define SW_PIN    PD2

volatile bool ledOn = false;

// Function to initialize pinmode and interrupt
void init() {
 // Set LED pin as output
  DDRB = DDRB |(1 << DDB5);
  // Set switch pin as  pull-up resistor
  PORTD = PORTD |(1 << SW_PIN);
  // Enable interrupt on the switch pin
  EIMSK = EIMSK |(1 << INT0);
  // Trigger interrupt on failing edge of the switch signal
  EICRA = (1 << ISC01);
  // Enable global interrupts
  sei();
}

// Interrupt service routine for the switch
ISR(INT0_vect) {
  // If the switch is pressed, toggle the LED state
  if ((~PIND & (1 << SW_PIN)) && !ledOn) {
   PORTB = PORTB | (1 << LED_PIN);
    ledOn = true;
  }
  else{
  PORTB = PORTB & ~(1 << LED_PIN);
    ledOn = false;
  }

}

int main(void) {
 // Initialization
  init();

 // Loop forever
 while (1) {

    // NOP
  }

  return 0;
}```
vhmi4jdf

vhmi4jdf1#

这段代码在Linux上还能用avr-gcc编译吗
我有点怀疑你是否能在AVR上运行Linux:)
但是不,它不会在Linux下编译gcc,因为它是无效的C。从C99到C17版本的标准,你需要#include <stdbool.h>来使用bool。C使用关键字_Boolboolstdbool.h只是一个宏。
即将到来的C23将删除所有这些废话,然后booltruefalse将成为正确的语言关键字。因此,如果您使用“gcc trunk”版本并使用-std=c2x编译,它实际上将在Linux上编译,该版本将于今年晚些时候正式发布为gcc 13 -std=c23
它在Arduino上编译的原因是因为你使用的是C++编译器。这是一种不同的编程语言。

vsdwdz23

vsdwdz232#

Arduino IDE使用C编译-您正在使用C而不是C -即使它是有效的C代码,并且您没有使用Arduino setup()/loop()框架或Arduino库。
然而,对于C,C99定义了一个内置类型_Bool。它这样做是因为所有存在的前C99代码可能以各种方式定义布尔类型或宏别名。它防止了引入新关键字booltruefalse可能导致的破坏现有代码。
C99还定义了一个标头stdbool. h,它为_Bool提供了一个类似Cbool别名,并为truefalse值提供了符号。在C代码中包含stdbool. h或cstdbool没有任何效果。
Arduino编译器与您建议在Linux上使用的AVR GCC交叉编译器相同。它支持C和C编译。您可以使用avr-g驱动程序进行C编译,但它与avr-gcc驱动程序的唯一区别是,它在调用ld时隐式地链接C库支持。否则,C或C编译由命令行开关或源文件扩展名决定。
因此,如果您使用与Arduino相同的C
编译,您的代码将使用AVR GCC编译,但如果您想确保它使用C或C++编译(或者您只是想使其有效的C代码),您可以简单地添加#include <stdbool.h>,它将在任何情况下工作。

相关问题