pw_chrono: Use compound literal in C, but not C++

- In the C duration macros, use a compound literal to initialize the
  duration struct inline. This is a C99 (not C++) feature, so do not use
  it if compiling as C++.
- Remove digit separators from
  PW_CHRONO_SYSTEM_CLOCK_PERIOD_SECONDS_DENOMINATOR, since they are not
  supported in C.
- Test the duration macros in both C and C++.

Change-Id: Id3502cf539f41fec276d786750317f74b083fc89
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/97224
Reviewed-by: Ewout van Bekkum <ewout@google.com>
Commit-Queue: Auto-Submit <auto-submit@pigweed.google.com.iam.gserviceaccount.com>
Pigweed-Auto-Submit: Wyatt Hepler <hepler@google.com>
diff --git a/pw_chrono/public/pw_chrono/internal/system_clock_macros.h b/pw_chrono/public/pw_chrono/internal/system_clock_macros.h
index 0cc684c..c905dd7 100644
--- a/pw_chrono/public/pw_chrono/internal/system_clock_macros.h
+++ b/pw_chrono/public/pw_chrono/internal/system_clock_macros.h
@@ -13,8 +13,15 @@
 // the License.
 #pragma once
 
+// The C implementation of this macro requires a C99 compound literal. In C++,
+// avoid the compound literal in case -Wc99-extensions is enabled.
+#ifdef __cplusplus
 #define _PW_SYSTEM_CLOCK_DURATION(num_ticks) \
   (pw_chrono_SystemClock_Duration{.ticks = (num_ticks)})
+#else
+#define _PW_SYSTEM_CLOCK_DURATION(num_ticks) \
+  ((pw_chrono_SystemClock_Duration){.ticks = (num_ticks)})
+#endif  // __cplusplus
 
 // clang-format off
 
diff --git a/pw_chrono/system_clock_facade_test.cc b/pw_chrono/system_clock_facade_test.cc
index af17a65..8039760 100644
--- a/pw_chrono/system_clock_facade_test.cc
+++ b/pw_chrono/system_clock_facade_test.cc
@@ -34,6 +34,19 @@
 pw_chrono_SystemClock_Nanoseconds pw_chrono_SystemClock_CallDurationToNsFloor(
     pw_chrono_SystemClock_Duration ticks);
 
+pw_chrono_SystemClock_Duration pw_chrono_SystemClock_Macros_100ms(void);
+pw_chrono_SystemClock_Duration pw_chrono_SystemClock_Macros_10s(void);
+pw_chrono_SystemClock_Duration pw_chrono_SystemClock_Macros_1min(void);
+pw_chrono_SystemClock_Duration pw_chrono_SystemClock_Macros_2h(void);
+pw_chrono_SystemClock_Duration pw_chrono_SystemClock_Macros_100msCeil(void);
+pw_chrono_SystemClock_Duration pw_chrono_SystemClock_Macros_10sCeil(void);
+pw_chrono_SystemClock_Duration pw_chrono_SystemClock_Macros_1minCeil(void);
+pw_chrono_SystemClock_Duration pw_chrono_SystemClock_Macros_2hCeil(void);
+pw_chrono_SystemClock_Duration pw_chrono_SystemClock_Macros_100msFloor(void);
+pw_chrono_SystemClock_Duration pw_chrono_SystemClock_Macros_10sFloor(void);
+pw_chrono_SystemClock_Duration pw_chrono_SystemClock_Macros_1minFloor(void);
+pw_chrono_SystemClock_Duration pw_chrono_SystemClock_Macros_2hFloor(void);
+
 }  // extern "C"
 
 // While testing that the clock ticks (i.e. moves forward) we want to ensure a
@@ -110,5 +123,33 @@
           kRoundedArbitraryDurationInC));
 }
 
+// Though the macros are intended for C use, test them in this file in C++.
+TEST(SystemClock, DurationMacros) {
+  EXPECT_EQ(pw_chrono_SystemClock_Macros_100ms().ticks,
+            PW_SYSTEM_CLOCK_MS(100).ticks);
+  EXPECT_EQ(pw_chrono_SystemClock_Macros_10s().ticks,
+            PW_SYSTEM_CLOCK_S(10).ticks);
+  EXPECT_EQ(pw_chrono_SystemClock_Macros_1min().ticks,
+            PW_SYSTEM_CLOCK_MIN(1).ticks);
+  EXPECT_EQ(pw_chrono_SystemClock_Macros_2h().ticks,
+            PW_SYSTEM_CLOCK_H(2).ticks);
+  EXPECT_EQ(pw_chrono_SystemClock_Macros_100msCeil().ticks,
+            PW_SYSTEM_CLOCK_MS_CEIL(100).ticks);
+  EXPECT_EQ(pw_chrono_SystemClock_Macros_10sCeil().ticks,
+            PW_SYSTEM_CLOCK_S_CEIL(10).ticks);
+  EXPECT_EQ(pw_chrono_SystemClock_Macros_1minCeil().ticks,
+            PW_SYSTEM_CLOCK_MIN_CEIL(1).ticks);
+  EXPECT_EQ(pw_chrono_SystemClock_Macros_2hCeil().ticks,
+            PW_SYSTEM_CLOCK_H_CEIL(2).ticks);
+  EXPECT_EQ(pw_chrono_SystemClock_Macros_100msFloor().ticks,
+            PW_SYSTEM_CLOCK_MS_FLOOR(100).ticks);
+  EXPECT_EQ(pw_chrono_SystemClock_Macros_10sFloor().ticks,
+            PW_SYSTEM_CLOCK_S_FLOOR(10).ticks);
+  EXPECT_EQ(pw_chrono_SystemClock_Macros_1minFloor().ticks,
+            PW_SYSTEM_CLOCK_MIN_FLOOR(1).ticks);
+  EXPECT_EQ(pw_chrono_SystemClock_Macros_2hFloor().ticks,
+            PW_SYSTEM_CLOCK_H_FLOOR(2).ticks);
+}
+
 }  // namespace
 }  // namespace pw::chrono
diff --git a/pw_chrono/system_clock_facade_test_c.c b/pw_chrono/system_clock_facade_test_c.c
index d8b21b6..6b5e0c4 100644
--- a/pw_chrono/system_clock_facade_test_c.c
+++ b/pw_chrono/system_clock_facade_test_c.c
@@ -31,3 +31,51 @@
     pw_chrono_SystemClock_Duration ticks) {
   return pw_chrono_SystemClock_DurationToNsFloor(ticks);
 }
+
+pw_chrono_SystemClock_Duration pw_chrono_SystemClock_Macros_100ms(void) {
+  return PW_SYSTEM_CLOCK_MS(100);
+}
+
+pw_chrono_SystemClock_Duration pw_chrono_SystemClock_Macros_10s(void) {
+  return PW_SYSTEM_CLOCK_S(10);
+}
+
+pw_chrono_SystemClock_Duration pw_chrono_SystemClock_Macros_1min(void) {
+  return PW_SYSTEM_CLOCK_MIN(1);
+}
+
+pw_chrono_SystemClock_Duration pw_chrono_SystemClock_Macros_2h(void) {
+  return PW_SYSTEM_CLOCK_H(2);
+}
+
+pw_chrono_SystemClock_Duration pw_chrono_SystemClock_Macros_100msCeil(void) {
+  return PW_SYSTEM_CLOCK_MS_CEIL(100);
+}
+
+pw_chrono_SystemClock_Duration pw_chrono_SystemClock_Macros_10sCeil(void) {
+  return PW_SYSTEM_CLOCK_S_CEIL(10);
+}
+
+pw_chrono_SystemClock_Duration pw_chrono_SystemClock_Macros_1minCeil(void) {
+  return PW_SYSTEM_CLOCK_MIN_CEIL(1);
+}
+
+pw_chrono_SystemClock_Duration pw_chrono_SystemClock_Macros_2hCeil(void) {
+  return PW_SYSTEM_CLOCK_H_CEIL(2);
+}
+
+pw_chrono_SystemClock_Duration pw_chrono_SystemClock_Macros_100msFloor(void) {
+  return PW_SYSTEM_CLOCK_MS_FLOOR(100);
+}
+
+pw_chrono_SystemClock_Duration pw_chrono_SystemClock_Macros_10sFloor(void) {
+  return PW_SYSTEM_CLOCK_S_FLOOR(10);
+}
+
+pw_chrono_SystemClock_Duration pw_chrono_SystemClock_Macros_1minFloor(void) {
+  return PW_SYSTEM_CLOCK_MIN_FLOOR(1);
+}
+
+pw_chrono_SystemClock_Duration pw_chrono_SystemClock_Macros_2hFloor(void) {
+  return PW_SYSTEM_CLOCK_H_FLOOR(2);
+}
diff --git a/pw_chrono_stl/public/pw_chrono_stl/system_clock_config.h b/pw_chrono_stl/public/pw_chrono_stl/system_clock_config.h
index 9766fa2..88ff7db 100644
--- a/pw_chrono_stl/public/pw_chrono_stl/system_clock_config.h
+++ b/pw_chrono_stl/public/pw_chrono_stl/system_clock_config.h
@@ -18,7 +18,7 @@
 // compatibility and we rely on implicit conversion to tell us at compile time
 // whether this is incompatible.
 #define PW_CHRONO_SYSTEM_CLOCK_PERIOD_SECONDS_NUMERATOR 1
-#define PW_CHRONO_SYSTEM_CLOCK_PERIOD_SECONDS_DENOMINATOR 100'000'0000
+#define PW_CHRONO_SYSTEM_CLOCK_PERIOD_SECONDS_DENOMINATOR 1000000000
 
 #ifdef __cplusplus